Если модель домена не является анемичной, вам нужно будет использовать события , чтобы сообщить о внутренних изменениях в модели обратно в ViewModel. Таким образом, вам не нужно беспокоиться о том, чтобы отслеживать, какие операции могут привести к несинхронизации виртуальной машины с моделью.
Вот простой пример:
Сначала образец модели:
public class NonAnemicModel
{
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name == value)
return;
_name = value;
OnNameChanged(EventArgs.Empty);
}
}
public event EventHandler NameChanged;
protected virtual void OnNameChanged(EventArgs e)
{
if (NameChanged != null)
NameChanged(this, e);
}
public void PerformNameCalculation(int chars)
{
//example of a complex logic that inadvertently changes the name
this.Name = new String('Z', chars); //makes a name of Z's
}
}
А вот пример ViewModel:
public class MyViewModel : INotifyPropertyChanged
{
private NonAnemicModel _model;
public NonAnemicModel Model
{
get { return _model; }
set
{
_model = value;
_model.NameChanged += (sender, args) => NotifyPropertyChanged("UserName");
}
}
public string UserName
{
get { return this.Model.Name; }
set { this.Model.Name = value; }
}
//this command would call out to the PerformNameCalculation method on the Model.
public ICommand PerformNameCalculation { get; private set; }
}
Обратите внимание, что событие PropertyChanged
возникает при изменении имени в модели. Таким образом, независимо от того, использовался ли установщик UserName или команда PerformNameCalculation, ViewModel остается синхронизированным. Большим недостатком этого является то, что вам нужно добавить намного больше событий в вашу модель, но я обнаружил, что наличие этих событий обычно очень полезно в долгосрочной перспективе. Только будьте осторожны с утечками памяти при событиях!