Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight MVVM链接模型和视图模型_Silverlight_Mvvm_Model_Linker - Fatal编程技术网

Silverlight MVVM链接模型和视图模型

Silverlight MVVM链接模型和视图模型,silverlight,mvvm,model,linker,Silverlight,Mvvm,Model,Linker,关于MVVM有很多很好的例子,但我仍然感到困惑 假设您有一个CustomerModel和一个CustomerServiceWModel。似乎CustomerModel上有一个Name属性,CustomerServiceWModel上有一个。CustomerViewModel上的setter将设置CustomerModel Name属性,然后调用OnPropertyChanged(PropName),以便更新UI。这是真的吗?似乎getter/setter将被定义两次。如果你有一个有50个属性的模

关于MVVM有很多很好的例子,但我仍然感到困惑

假设您有一个CustomerModel和一个CustomerServiceWModel。似乎CustomerModel上有一个Name属性,CustomerServiceWModel上有一个。CustomerViewModel上的setter将设置CustomerModel Name属性,然后调用OnPropertyChanged(PropName),以便更新UI。这是真的吗?似乎getter/setter将被定义两次。如果你有一个有50个属性的模型,那么这将变得非常乏味


另外,假设我设置了一个Qty属性。ViewModel将更新模型。模型将基于新数量更新其值属性。ViewModel如何得到模型属性更改的通知?

在您给出的客户示例中,CustomerModel包含数据库(或其他后端)存储的所有信息。如果要在UI上显示CustomerViewModel(名称等,如果有大型类,可能还有50个其他属性),则CustomerViewModel包含类似的信息,但as使用INotifyPropertyChanged接口将它们显示为视图(即XAML)可以绑定的属性

e、 g

ViewModel还包含其他一些UI状态—可见性标志、当前选项卡索引、由多个字段中的数据构建的更复杂的文本位、子项的ObservableCollection等。所有这些都将绑定到XAML

我看到从模型创建的ViewModel是一个一次性的单向过程,例如使用构造函数:

  CustomerViewModel viewModel = new CustomerViewModel(customer);
或者作为扩展方法

  CustomerViewModel viewModel = customer.ToViewModel();
我还没有看到任何关于更新ViewModel以更改模型的规定-ViewModel的要点是它与模型隔离。它保留数据的单独副本。它不会将更改传播回模型,直到您按下“保存”按钮。因此,如果取消,则模型中的任何内容都没有更改,也没有要撤消的内容

您可能试图使ViewModel与模型保持最新—在大多数情况下(如保存或加载),您只需丢弃当前ViewModel,然后根据模型的当前状态创建一个新的ViewModel即可。是否需要保持ViewModel的UI状态并更改其中的数据?这不是一个常见的需求,但可以在发生保存或加载时调用一两个方法来完成


所以也有一个假设,这种连接逻辑发生在某个地方。这就是为什么大多数涉及视图的模式还涉及负责执行命令(例如,显示客户、保存客户)并随后设置新UI状态的控制器。

您的视图模型不必严格封装模型。在您的场景中,CustomerViewModel可能有一个Customer属性,这最终意味着您的视图绑定到模型属性。。。它只是通过ViewModel执行此操作。这是完全合法的。不过,也就是说,封装它通常有好处。您的业务模型可能不包括更改通知。在用户单击OK按钮之前,您可能不希望用户交互修改业务模型。当您希望使用另一种形式的验证时,您的业务模型可能会因输入错误而出现异常。我相信你能想到其他的事情。事实上,我猜大多数时候你都会想要封装,所以从编写大量无意义的中继方法的意义上讲,它并不真的“乏味”。

具体如何做到这一点,部分取决于你的商业模式,正如前面所说的


根据您在UI中显示客户信息的方式,您可能在ViewModel中有一个可观察的客户(您的模型)类型集合。例如,如果您正在显示一个主/详细场景,在该场景中,您可能会有一个客户列表,并在选择特定客户时在下面显示详细信息。

如果将ViewModel与模型分开,如何应用模型中的任何规则?假设我有一个带有数量和价值的模型。如果我更改ViewModel上的数量,则该数量应流向基于新数量更新值的模型。现在,ViewModel应该显示新的值。“如果我更改ViewModel上应该流向模型的数量”否,直到您按下保存按钮或类似按钮。当您这样做时,该处理程序应该更新模型,将其持久化,并使新的ViewModel脱离新模型状态。因此,如果它没有流向模型,那么ViewModel如何获得更新的值字段?如果我更改数量,作为用户,我希望看到新的值。MV没有计算值的业务逻辑,只有模型有。
  CustomerViewModel viewModel = customer.ToViewModel();