在你提供的客户示例中,CustomerModel 包含数据库(或其他后端)存储的所有信息。如果要在 UI 上显示(例如名称等),CustomerViewModel 包含类似的信息,但使用 INotifyPropertyChanged 接口将它们显示为 View(即 XAML)可以绑定到的属性。可能有 50 个其他属性,如果你有一个大的类。
public int Name
{
get
{
return this.name;
}
set
{
if (this.name!= value)
{
this.name= value;
this.OnPropertyChanged("Name");
}
}
}
ViewModel还包含其他UI状态的位 - 可见性标志,当前选项卡索引,由多个字段中的数据构建的更复杂的文本位,ObservableCollection<>的子项等。所有这些都可以绑定到XAML。
我曾经看到过将ViewModel从Model创建为一次性的、单向的过程,例如使用构造函数:
CustomerViewModel viewModel = new CustomerViewModel(customer);
或者作为扩展方法。
CustomerViewModel viewModel = customer.ToViewModel();
我没有看到更新ViewModel以响应Model更改的任何规定 - ViewModel的重点是与Model隔离。它保留数据的单独副本。它不会将更改传播回模型,除非您按下“保存”按钮。因此,如果您取消操作,模型中的内容没有更改,也没有可以撤消的内容。
您可能过于努力使ViewModel与Model保持同步 - 大多数情况下,例如保存或加载,您可以仅丢弃当前的ViewModel,并从模型的当前状态创建一个新的ViewModel。您需要保留ViewModel的UI状态并在其中更改数据吗?这不是常见的要求,但是可以通过在保存或加载时调用一两个方法来完成。
因此,还有假设这种连接逻辑发生在某个地方。这就是为什么大多数涉及视图的模式也涉及负责执行命令(例如显示客户,保存客户)并设置新UI状态的控制器的原因。