В нашем приложении есть много объектов Model, которые имеют сотни свойств.
Для каждого свойства в модели:
public string SubscriptionKind { get; set; }
...100x...
нам пришлось создать свойство с поддержкой INotifyPropertyChanged в ViewModel:
#region ViewModelProperty: SubscriptionKind
private int _subscriptionKind;
public int SubscriptionKind
{
get
{
return _subscriptionKind;
}
set
{
_subscriptionKind = value;
OnPropertyChanged("SubscriptionKind");
}
}
#endregion
...100x...
Это означало, что когда наш View отправил событие Save, нам пришлось переназначить все эти значения модели представления обратно в модель:
customer.SubscriptionKind = this.SubscriptionKind
...100x...
Это стало утомительным и отнимающим много времени, поскольку модели продолжали меняться, и нам приходилось отображать все изменения во ViewModels.
Через некоторое время мы поняли, что было бы проще просто подключить DataContext представления напрямую к модели, что позволяет нам привязать элементы XAML непосредственно к свойствам объекта модели, чтобы событие сохранения просто сохранит объект без какого-либо сопоставления.
Что мы потеряли в ходе этого хода:
возможность через
UpdateSourceTrigger=PropertyChanged
выполнять детальную проверку и манипулировать в средствах настройки свойств ViewModel, что мне очень понравилось: этого у нас больше нет, поскольку любое изменение в XAML simple изменяет немое свойство моделивозможность (в будущем) создавать фиктивные представления, которые тестируют логику пользовательского интерфейса нашей модели представления новым способом, например «если для свойства SubscriptionKind установлено значение« Ежегодно », то (1) измените скидку на 10%, (2) запустите« анимацию поздравления »и (3) сделайте кнопку заказа более заметной.
Оба этих подхода имеют очевидные преимущества, например Первый подход «Просмотр прямо в модель», особенно в сочетании с LINQ-to-SQL, является прагматичным и позволяет быстро создавать полезное программное обеспечение, при условии, что вы используете {Binding...}
вместо x:Name
у вас все еще есть возможность «передать свои представления Blend Designer».
С другой стороны, хотя MVVM требует от вас утомительного сопоставления модели с ViewModel, он дает вам мощные преимущества проверки и тестирования, которых нет у первого подхода.
Как вам удалось объединить преимущества этих двух подходов в своих проектах?