Я недавно работал с WPF и MVVM. У меня создалось впечатление, что я хорошо понял шаблон MVVM, но у меня возникли некоторые сомнения.Должен ли я иметь инкапсулирующую ViewModel для каждой модели?
Прямо сейчас, У меня есть инкапсулирующий объект ViewModel для каждого объекта модели. Скажем, моя модель содержит два класса: Property
, в котором содержится список PropertyValue
. В моей модели ViewModel у меня есть PropertyVm
, который содержит Property
и список PropertyValueVm
(каждый из которых содержит PropertyValue
). Оба Vm реализуют BaseVm
, который содержит метод OnPropertyChanged
.
Рассмотрите представление с двумя выпадающими списками, для Property
и PropertyValue
. Первый выпадающий-х ItemsSource
будет связан с коллекцией PropertyVms
и второй выпадающий-х ItemsSource
будет связан с PropertyValueVms
от PropertyVm
, выбранного в выпадающем списке 1.
Это все основано на статье, которая заставила меня изучить WPF и MVVM в первую очередь: Simplifying the WPF TreeView by Using the ViewModel Pattern, by Josh Smith
Однако меня все больше раздражает большое количество классов ViewModel, которые содержит мой проект, некоторые из которых содержат очень мало кода или просто ничего, кроме соответствующего класса модели.
Другие реализации, с которыми я столкнулся, имеют вместо этого объекты модели INotifyPropertyChanged
. Это означало бы, что вы напрямую привязываете объекты Model к Comboboxes. Это уменьшит количество классов ViewModel, но разве это не нарушает основы MVVM?
Я также видел людей, выступающих за один ViewModel за просмотр. Но я боюсь, что это превратит мои классы ViewModel в обширные, бессвязные стены текстов.
Итак, мой вопрос: если у меня есть инкапсулирующая ViewModel для каждой модели? Если нет, то что лучше?
Я думаю, что вы закончили думать об этом. Практика использования ViewModel для каждого представления - это то, что я бы рекомендовал. Я не вижу преимуществ в классах модели «Обертка» в ViewModel.Имейте ViewModel для каждого представления, которое наследуется от класса baseviewmodel, у которого есть все ваши функции уведомления об изменениях. Затем у вас есть требуемые классы моделей для представления, открытого как общедоступное свойство, к которому привязывается представление. Остальная часть ViewModel будет содержать ваши бизнес-логические методы. –
Я бы сказал, что вам нужна модель просмотра для каждого вида ... – blindmeis