5 silverlight linker model mvvm
MVVM上有很多很好的例子,但我仍然感到困惑.
假设您有CustomerModel和CustomerViewModel.似乎CustomerModel上有一个Name属性,CustomerViewModel上有一个.CustomerViewModel上的setter将设置CustomerModel Name属性,然后调用OnPropertyChanged(PropName)以便UI更新.这是真的吗?似乎getter/setter将被定义两次.如果你有一个拥有50个属性的模型,那将会变得非常繁琐.
另外,假设我设置了一个Qty属性.ViewModel更新模型.模型根据新的数量更新其Value属性.如何通知ViewModel Model属性发生了变化?
您的ViewModel不必严格封装Model.在您的场景中,CustomerViewModel可能具有Customer属性,这最终意味着您的View绑定到Model属性......它只是通过ViewModel实现.那是完全合法的.也就是说,封装它通常是有益的.您的商业模式可能不包含更改通知.在用户单击"确定"按钮之前,您可能不希望用户交互修改业务模型.您的业务模型可能通过异常输入错误,而您希望使用其他形式的验证.我相信你能想到其他的事情.事实上,我猜大多数时候你都想要封装,所以在编写大量无意义的中继方法时,它并不是真的"乏味".
在您提供的客户示例中,CustomerModel 包含数据库(或其他后端)存储的所有信息。如果要在 UI 上显示,则 CustomerViewModel 包含类似的信息(名称等,如果您有一个大型类,则可能还有 50 个其他属性),但使用 INotifyPropertyChanged 接口将它们显示为视图(即 XAML)可以显示的属性绑定到。
例如
public int Name
{
get
{
return this.name;
}
set
{
if (this.name!= value)
{
this.name= value;
this.OnPropertyChanged("Name");
}
}
}
Run Code Online (Sandbox Code Playgroud)
ViewModel 还包含其他 UI 状态位 - 可见性标志、当前选项卡索引、根据多个字段中的数据构建的更复杂的文本位、子项的 ObservableCollection<> 等。所有这些都将绑定到 XAML。
我已经看到从模型创建的 ViewModel 作为一次性、单向过程,例如使用构造函数:
CustomerViewModel viewModel = new CustomerViewModel(customer);
Run Code Online (Sandbox Code Playgroud)
或作为扩展方法
CustomerViewModel viewModel = customer.ToViewModel();
Run Code Online (Sandbox Code Playgroud)
我还没有看到任何更新 ViewModel 以更改模型的规定 - ViewModel 的要点是它与模型隔离。它保留数据的单独副本。它不会将更改传播回模型,直到您按下“保存”按钮。因此,如果您取消,模型中的任何内容都不会更改,也无法撤消。
您可能过于努力地使 ViewModel 与模型保持同步 - 大多数情况(例如保存或加载)您可以丢弃当前的 ViewModel 并根据模型的当前状态创建一个新的 ViewModel。您是否需要保留 ViewModel 的 UI 状态并更改其中的数据?这不是常见的要求,但可以通过保存或加载发生时调用的一两个方法来完成。
因此,还假设这种接线逻辑发生在某个地方。这就是为什么大多数涉及视图的模式还涉及控制器,控制器负责执行命令(例如显示客户、保存客户)并随后设置新的 UI 状态。
| 归档时间: |
|
| 查看次数: |
1572 次 |
| 最近记录: |