WPF MVVM - создание экземпляра ViewModel из другой ViewModel - PullRequest
0 голосов
/ 04 февраля 2020

Я новичок в MVVM и все еще учусь. Я использовал статью в приведенной ниже ссылке в качестве примера для реализации простого приложения с рабочим пространством с вкладками, которое использует два представления: «Все клиенты» и «Новый клиент».

https://docs.microsoft.com/en-us/archive/msdn-magazine/2009/february/patterns-wpf-apps-with-the-model-view-viewmodel-design-pattern#relaying -команда- logi c

В примере, использованном в статье выше, приложение оболочки (MainWindowViewModel) использует панель управления с двумя кнопками: «Просмотреть всех клиентов» и «Создать нового клиента». Когда пользователь нажимает эти кнопки, в рабочей области с вкладками основной оболочки открывается соответствующий вид.

Теперь у меня вопрос: если мы хотим добавить кнопку «Создать нового клиента» в представлении «Все клиенты», и когда пользователь нажимает на эту кнопку, представление «Новый клиент» открывается как рабочее пространство с вкладками. в основной оболочке, что было бы лучшим способом сделать это?

Нужно ли использовать службу обмена сообщениями для широковещательной рассылки / отправки всем коллегам, например, сообщения «CreateNewCustomer», и иметь основную оболочку? (MainWindowViewModel) зарегистрироваться в «CreateNewCustomer», и тогда его действие будет заключаться в создании экземпляра представления «Новый клиент» в его рабочем пространстве с вкладками?

Или есть лучший, более простой / более элегантный способ сделать это? Обратите внимание, что я не использую Prism, MVVMLight или любую другую инфраструктуру MVVM. Я строю свою собственную структуру как часть моего обучения.

Большое спасибо, что нашли время ответить на мои вопросы.

1 Ответ

1 голос
/ 04 февраля 2020

Если я последую вашему описанию.

У вас должна быть WindowViewmodel.

Возможно, у вас есть коллекция моделей для ваших вкладок. Или, если это не так, это может сработать.

В зависимости от того, как все работает, в пользовательском контроле, над которым вы работаете, будет кнопка, и это дочерний элемент того же окна, в котором вы собираетесь показать что-то еще. on.

Добавьте команду NewUserCommand в WindowViewmodel. Эта новость и добавляет NewCustomerViewModel в коллекцию, к которой привязан ваш tabcontrol. Сначала шаблоны вкладываются в NewCustomerView с использованием viewmodel.

Остальная проблема заключается в том, как перейти от кнопки, которая находится в дочернем пользовательском контроле, к модели представления окна. Вы делаете это с помощью привязки к родственному источнику. Это будет выглядеть примерно так:

{Binding DataContext.NewUserCommand,
  RelativeSource={RelativeSource AncestorType={x:Type YourWindowType}}}

Предполагается, что у вас все в порядке с tabcontrol для вашего «рабочего пространства с вкладками». Если вы как-то имеете в виду windows, тогда я рекомендую пересмотреть это.

Я бы также сказал, что изучение wpf достаточно сложно без выбора инфраструктуры, которая облегчит ваши команды. Я предлагаю вам взглянуть на исходный код для mvvmlight и relaycommand. Там много чего. Messenger также довольно удобная вещь для использования. Я часто не использую ничего, кроме relaycommand и messenger out mvvmlight, кстати.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...