Создание модели MVVM - PullRequest
11 голосов
/ 25 мая 2011

После WPF MvvmFoundation , связывание View с ViewModel имеет много вариантов, как описано в http://www.paulstovell.com/mvvm-instantiation-approaches.

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

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

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

Ответы [ 5 ]

11 голосов
/ 26 мая 2011

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

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        mainWindow = new MainWindow();
        mainWindow.DataContext = new MainWindowViewModel(new Model());
        mainWindow.Show();
    }
4 голосов
/ 25 мая 2011

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

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

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

2 голосов
/ 26 мая 2011

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

1 голос
/ 26 мая 2011

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

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

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

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

0 голосов
/ 28 августа 2015

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

...