#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
или PrismEventAggregator
5. @Рэйчел: Да, конечно. Я имел в виду это только как намек на решение. Я использовал этот способ для некоторого взаимодействия между ViewModel. Тем не менее, для бизнес-логики, которая должна быть во взаимосвязанных моделях, проблема не имеет простого решения, если кажется, что MVVM.
Ответ №3:
Для этого я использую dependency injection / MEF. Просто экспортируйте все мои классы моделей по всей цепочке и автоматически импортируйте их для меня в конструктор ViewModel.
Комментарии:
1. Тогда как вы связываете экземпляры моделей вместе?
Ответ №4:
Я использую множество различных подходов в зависимости от ситуации. Я обнаружил, что когда дело доходит до связывания этих данных, один размер не подходит для всех.
Для простых случаев я хочу, чтобы ViewModel и модель были одним и тем же. Очевидно, что это не так хорошо для всех случаев, но иногда просто нет необходимости прилагать дополнительные усилия, чтобы отделить M от виртуальной машины. (Отлично подходит для случаев, когда у вас есть, скажем, элементы listbox, содержащие скудную информацию)
Иногда, особенно когда модель представляет собой фрагмент кода, к которому у вас нет доступа (написанный другим разработчиком), Легко подклассифицировать модель и добавить в нее все, что есть у вашей виртуальной машины (наблюдаемые свойства и т.д.).
Наконец, я буду использовать подход, о котором упоминает Сувик. Создайте виртуальную машину с информацией о модели, которую вы хотите использовать в качестве параметра, или разрешите передавать ее иным образом. Вероятно, это наиболее распространенный подход для моих более крупных и сложных отношений Model / ViewModel.
Ответ №5:
Я автоматически передаю экземпляр IRepository в конструктор виртуальной машины, используя контейнер IoC, и все, что виртуальная машина должна делать с моделями, выполняется через этот репозиторий. Репозиторий — это класс, который: создает, читает, обновляет и удаляет данные. Когда мне нужно показать какой-либо вид (window), я использую IViewService.ShowDialog(ViewModel как ViewModelBase). В реализации IViewService на виртуальных машинах зарегистрированы представления, поэтому виртуальным машинам нужно знать только другие виртуальные машины, а не их представления (например, «Покажите мне представление для этой модели представления»).