В приведенном вами примере клиента CustomerModel содержит всю информацию, хранящуюся в вашей базе данных (или другом бэкэнде). CustomerViewModel содержит аналогичную информацию, если она будет отображаться в пользовательском интерфейсе (имя и т. Д., Возможно, 50 других свойств, если у вас большой класс), но использует интерфейс INotifyPropertyChanged, чтобы показать их как свойства, которые может просматривать представление (то есть XAML). привязать к.
, например
public int Name
{
get
{
return this.name;
}
set
{
if (this.name!= value)
{
this.name= value;
this.OnPropertyChanged("Name");
}
}
}
ViewModel также содержит другие биты состояния пользовательского интерфейса - флаги видимости, текущий индекс табуляции, более сложные биты текста, построенные из данных в нескольких полях, ObservableCollection <> дочерних элементов и т. Д. Все они должны быть связаны с XAML.
Я видел ViewModel, созданный из Модели, как однократный односторонний процесс, например, с конструктором:
CustomerViewModel viewModel = new CustomerViewModel(customer);
или как метод расширения
CustomerViewModel viewModel = customer.ToViewModel();
Я не видел каких-либо условий для обновления ViewModel для изменений в модели - смысл ViewModel в том, что он изолирован от модели. Хранит отдельную копию данных. Изменения не распространяются на модель, пока вы не нажмете кнопку «Сохранить». Так что если вы отмените вместо этого, ничего в модели не изменилось, и отменить нечего.
Возможно, вы слишком стараетесь поддерживать ViewModel в актуальном состоянии с моделью - в большинстве случаев, таких как сохранение или загрузка, вы можете просто выбросить текущую модель ViewModel и создать новую из текущего состояния модели. Вам нужно сохранить состояние пользовательского интерфейса ViewModel и изменить данные в нем? Это не общее требование, но его можно выполнить с помощью метода или двух, вызываемых при сохранении или загрузке.
Так что есть также предположение, что эта логика соединения где-то происходит. Именно поэтому большинство шаблонов, которые включают представления , также включают контроллеры , которые отвечают за выполнение команд (например, отображение клиента, сохранение клиента) и настройку нового состояния пользовательского интерфейса впоследствии.