Создание экземпляра модели MVVM

#wpf #mvvm #model #instantiation

#wpf #mvvm #Модель #создание экземпляра

Вопрос:

Следуя WPF MvvmFoundation, связывание представления с ViewModel имеет множество вариантов, подобных описанному на http://www.paulstovell.com/mvvm-instantiation-approaches.

Однако в их примере ничего не говорится о том, как связать ViewModel с моделью.

Традиционно сначала я создавал модель, а затем одно или несколько представлений, которые ее отображают. Кажется, что MVVM подталкивает людей к созданию представления, которое создает ViewModel, которые создают модель. Я надеюсь, что это не так, поскольку подключение сложной бизнес-модели к различным ModelView может быть сложным.

Как создать экземпляр ваших классов бизнес-модели в MVVM и связать их с вашими ViewModels?

Комментарии:

1. Я нашел некоторую информацию об этой проблеме на marlongrech.wordpress.com/2008/03/20/more-than-just-mvc-for-wpf . Обсуждаемое решение заключается в использовании шаблона проектирования посредника , например, через сообщение MVVM Foundation. Это помогает взаимодействию между ViewModel, которое является частью проблемы.

Ответ №1:

Обычно я передаю объекты модели в качестве параметров конструктора виртуальной машине. Я использую класс App в качестве контроллера, который будет инициализировать MainWindow, MainWindowViewModel с основной моделью. После этого MainWindowViewModel позаботится об инициализации других виртуальных машин соответствующими объектами модели.

     private void Application_Startup(object sender, StartupEventArgs e)
    {
        mainWindow = new MainWindow();
        mainWindow.DataContext = new MainWindowViewModel(new Model());
        mainWindow.Show();
    }
  

Ответ №2:

Вы создаете свои классы BusinessModel внутри своей ViewModel.

Итак, в вашем, CustomerViewModel вы бы сказали this.CurrentCustomer = new CustomerModel() , и ваш CustomerView привязался бы к CurrentCustomer свойству ViewModel

Если вам интересно, я написал простой пример с использованием MVVM в качестве примера взаимодействия представления, модели и ViewModel.

Комментарии:

1. Я видел, как это обычно работает, но это довольно сложно, когда у вас есть модель, состоящая из нескольких взаимосвязанных классов, которые что-то делают в фоновом режиме. Затем различные ModelView хотели бы получить доступ к различным классам в модели. Конечно, модель могла бы быть сформирована для поддержки этого , но тогда это не было бы на самом деле бизнес-моделью.

2. Модели @Wernight не должны ничего делать в фоновом режиме. Это просто фиктивные контейнеры для хранения данных. Фоновые процессы должны выполняться в ViewModel. Какие процессы выполняет ваша модель?

3. @Rachel: Пример на marlongrech.wordpress.com/2008/03/20/more-than-just-mvc-for-wpf было бы достаточно. Поиск и список продуктов должны отображать все элементы, таким образом, просматривается одна и та же модель списка продуктов . Это означает, что ModelView не должен напрямую создавать модель.

4. @Wernight Размещенная вами ссылка не использует MVVM. Он использует MVC, что не одно и то же. Если вы хотите реализовать аналогичную связь между вашими ViewModels в MVVM, я бы рекомендовал вам изучить MVVM Light Messenger или Prism EventAggregator

5. @Рэйчел: Да, конечно. Я имел в виду это только как намек на решение. Я использовал этот способ для некоторого взаимодействия между ViewModel. Тем не менее, для бизнес-логики, которая должна быть во взаимосвязанных моделях, проблема не имеет простого решения, если кажется, что MVVM.

Ответ №3:

Для этого я использую dependency injection / MEF. Просто экспортируйте все мои классы моделей по всей цепочке и автоматически импортируйте их для меня в конструктор ViewModel.

Комментарии:

1. Тогда как вы связываете экземпляры моделей вместе?

Ответ №4:

Я использую множество различных подходов в зависимости от ситуации. Я обнаружил, что когда дело доходит до связывания этих данных, один размер не подходит для всех.

Для простых случаев я хочу, чтобы ViewModel и модель были одним и тем же. Очевидно, что это не так хорошо для всех случаев, но иногда просто нет необходимости прилагать дополнительные усилия, чтобы отделить M от виртуальной машины. (Отлично подходит для случаев, когда у вас есть, скажем, элементы listbox, содержащие скудную информацию)

Иногда, особенно когда модель представляет собой фрагмент кода, к которому у вас нет доступа (написанный другим разработчиком), Легко подклассифицировать модель и добавить в нее все, что есть у вашей виртуальной машины (наблюдаемые свойства и т.д.).

Наконец, я буду использовать подход, о котором упоминает Сувик. Создайте виртуальную машину с информацией о модели, которую вы хотите использовать в качестве параметра, или разрешите передавать ее иным образом. Вероятно, это наиболее распространенный подход для моих более крупных и сложных отношений Model / ViewModel.

Ответ №5:

Я автоматически передаю экземпляр IRepository в конструктор виртуальной машины, используя контейнер IoC, и все, что виртуальная машина должна делать с моделями, выполняется через этот репозиторий. Репозиторий — это класс, который: создает, читает, обновляет и удаляет данные. Когда мне нужно показать какой-либо вид (window), я использую IViewService.ShowDialog(ViewModel как ViewModelBase). В реализации IViewService на виртуальных машинах зарегистрированы представления, поэтому виртуальным машинам нужно знать только другие виртуальные машины, а не их представления (например, «Покажите мне представление для этой модели представления»).