Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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
Wpf 在MVVM中,如何将视图逻辑排除在模型之外,将业务逻辑排除在视图模型之外?_Wpf_Mvvm_Viewmodel_Business Logic - Fatal编程技术网

Wpf 在MVVM中,如何将视图逻辑排除在模型之外,将业务逻辑排除在视图模型之外?

Wpf 在MVVM中,如何将视图逻辑排除在模型之外,将业务逻辑排除在视图模型之外?,wpf,mvvm,viewmodel,business-logic,Wpf,Mvvm,Viewmodel,Business Logic,如果不在我的模型中添加一堆特定于UI的内容,如InotifyPropertyChanged和INotifyCollectionChanged,或者创建大量不同的事件,并执行一堆感觉它们是特定于UI的、不应该出现在模型中的事情,我无法完全理解如何让视图模型收到模型中更改的通知 否则,我只需要复制视图模型中的所有业务逻辑,以确保所有内容都是最新的,那么拥有该模型有什么意义呢 我在模型中遇到的一个棘手问题是“Category”类的属性。您可以将其视为一个树结构,该属性是所有叶节点子体。在这个模型中,属

如果不在我的模型中添加一堆特定于UI的内容,如InotifyPropertyChanged和INotifyCollectionChanged,或者创建大量不同的事件,并执行一堆感觉它们是特定于UI的、不应该出现在模型中的事情,我无法完全理解如何让视图模型收到模型中更改的通知

否则,我只需要复制视图模型中的所有业务逻辑,以确保所有内容都是最新的,那么拥有该模型有什么意义呢


我在模型中遇到的一个棘手问题是“Category”类的属性。您可以将其视为一个树结构,该属性是所有叶节点子体。在这个模型中,属性是通过它的所有子级递归地动态生成的,这一切都很好。但是,视图模型需要绑定到该属性,并且需要知道它何时更改。我是否应该更改模型以适应视图模型?如果我这样做了,那么视图模型在这一点上并没有真正做任何事情,模型会引发所有必要的更改通知,视图可以直接绑定到模型。另外,如果模型是我没有源代码的东西,我将如何解决这个问题?

我不同意
INotifyPropertyChanged
INotifyCollectionChanged
是特定于用户界面的。它们位于未绑定到任何特定UI堆栈的命名空间和程序集中。出于这个原因,我通常将这种行为尽可能地放在系统的底层(通常是数据层)


如果有什么原因你不想把它放在那个水平上,那没关系。您可以将其放在更高的级别,例如服务或UI层。但是,您需要确保对数据结构的所有更改也通过该层进行。

实际上,INotifyCollectionChanged是WindowsBase.dll中System.Collections.Specialized的一部分。我总是觉得这很奇怪,卡梅隆说得对。我发现这同样令人困惑。相应地更新我的答案……嗯,我想我唯一一次听说它们是用于数据绑定的WPF教程,但我想它们除了用于WPF之外,没有什么本质上的WPF。@Davy8:正确。WPF本机理解这些接口,但WinForms也理解INotifyPropertyChanged和IBindingList。INotifyCollectionChanged只是IBindingList的新(更简单)版本。Net 4.0已将这些接口(包括ObservableCollection)移动到System.dll。