Создание модели MVVM
После WPF MvvmFoundation ссылка на View с ViewModel имеет множество вариантов, как описано в http://www.paulstovell.com/mvvm-instantiation-approaches.
Однако в их примере нет ничего о том, как связать ViewModel с Model.
Традиционно я сначала создал модель, а затем одно или несколько видов, которые ее отображают. Кажется, что MVVM подталкивает людей к созданию представления, которое создает ViewModel, которые создают модель. Надеюсь, это не так, потому что проводка сложной бизнес-модели с различным ModelView может быть жесткой.
Как вы создаете свои классы бизнес-моделей в MVVM и ссылку их с помощью ViewModels?
Ответы
Ответ 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 в качестве примера того, как взаимодействуют View, Model и ViewModel.
Ответ 3
Я использую инъекцию зависимостей /MEF для этого. Просто экспортируйте все мои классы моделей по всей цепочке и импортируйте их автоматически в конструктор ViewModel.
Ответ 4
В зависимости от ситуации я использую различные подходы. Я обнаружил, что когда дело доходит до передачи этих данных, один размер не подходит для всех.
В простых случаях у меня будет ViewModel, а модель - то же самое. Очевидно, что это не так хорошо для всех случаев, но иногда просто нет необходимости проходить лишнюю милю, чтобы разделить M от виртуальной машины. (Отлично подходит для случаев, когда у вас есть, скажем, элементы списка, которые имеют скудную информацию)
Иногда, особенно когда модель представляет собой кусок кода, к которому у вас нет доступа (написанный другим разработчиком), легко подклассифицировать модель и добавить все ваши вещи VM (наблюдаемые свойства и т.д.) на к нему.
Наконец, я буду использовать подход, упомянутый Сувиком. Постройте виртуальную машину с информацией о модели, которую вы хотите использовать в качестве параметра, или разрешите ее передавать в противном случае. Это, вероятно, самый распространенный подход для моих более крупных и сложных отношений Model/ViewModel.
Ответ 5
Я автоматически передаю экземпляр IRepository в конструктор VM, используя контейнер IoC, и все, что нужно сделать VM с моделями, осуществляется через этот репозиторий. Репозиторий - это класс, который: создает, считывает, обновляет и удаляет данные. Когда мне нужно показать какое-то представление (окно), я использую IViewService.ShowDialog(viewModel As ViewModelBase). При реализации IViewService в VM есть записи, поэтому виртуальные машины должны знать только другие виртуальные машины, а не их представления (например, "Показать мне эту модель для просмотра" ).