В нашем приложении у нас есть множество моделей объектов, которые имеют сотни свойств.
Для каждого свойства модели :
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...
, что означало, что когда наше представление отправляло событие Сохранить , нам пришлось переназначить все эти значения модели представления обратно в модель:
customer.SubscriptionKind = this.SubscriptionKind
...100x...
Это стало утомительным и заняло много времени, так как модели продолжали меняться, и нам пришлось отобразить все изменения в ViewModels.
Через некоторое время мы поняли, что было бы проще просто подключить DataContext представления напрямую к модели, что позволяет нам связывать элементы XAML непосредственно со свойствами объекта Model, чтобы Событие save просто сохранит объект без какого-либо сопоставления.
Что мы потеряли в этом ходу:
возможность с помощью UpdateSourceTrigger=PropertyChanged
выполнять детальную проверку и манипуляции в SetMerter свойств ViewModel, что мне очень понравилось: этого у нас больше нет, так как никаких изменений в XAML просто изменяет тупое свойство в Model
способность (в будущем) создавать фиктивных представлений , которые по-новому проверяют логику пользовательского интерфейса нашей модели представления, например, "если для свойства SubscriptionKind установлено значение" Ежегодно ", то (1) измените скидку на 10%, (2) запустите" анимацию поздравлений "и (3) сделайте кнопку заказа более заметной.
Оба этих подходов имеют очевидных преимуществ , например. первый подход «View-direct-to-Model», особенно в сочетании с LINQ-to-SQL , прагматичен и позволяет вам быстро создавать полезное программное обеспечение, если вы используете {Binding...}
вместо x:Name
у вас все еще есть возможность "передать свои взгляды в Blend Designer".
С другой стороны, хотя MVVM требует от вас поддерживать утомительное отображение модели на ViewModel, оно дает вам мощные проверки и тестирования преимуществ, которых не имеет первый подход.
Как вам удалось объединить преимущества этих двух подходов в ваших проектах?