Создание модели 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 есть записи, поэтому виртуальные машины должны знать только другие виртуальные машины, а не их представления (например, "Показать мне эту модель для просмотра" ).