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