ViewModel是否应该传递DependencyProperties并绑定到Model上的DependencyProperties?

ric*_*ice 5 c# wpf mvvm

我是WPF/MVVM的新手,我发现的例子似乎并没有涵盖我所面临的问题.

我有一个用于管理相当复杂的业务配置对象的屏幕.在MVVM中,我认为这意味着我应该拥有以下内容:

  1. 具有接近零逻辑的XAML视图
  2. 具有屏幕逻辑的ViewModel类
  3. 我通常的业务类充当了Model的角色,拥有所有业务逻辑

在我的情况下,有业务规则说我的业务类fieldA的更改可能有各种副作用,例如更改fieldB的值,或填充整个子对象列表.

我可能是错的,但我认为我应该将这些规则封装在业务类中,因为这些规则实际上并不是关于屏幕的实体.

当然,这些副作用需要立即回到屏幕上.

因此,从用户的角度来看,他可能会编辑fieldA,并在View上看到fieldB更新.

我理解如何从View到ViewModel进行数据绑定.

但就我而言,似乎我需要两层数据绑定:一个在View和ViewModel之间,另一个在ViewModel和Model之间.

鉴于我有两次基本相同的问题,我认为应该适用一种解决方案.所以我将我的Model类变成了DependencyObject,并将其属性设置为DependencyProperties.

以fieldA为例,它将出现在所有三个层中:

  1. 作为可视组件数据绑定到ViewModel.FieldA,例如text ="{Binding FieldA,Mode = TwoWay}"
  2. ViewModel作为DependencyProperty绑定到"向上"到View,并"向下"到Model
  3. 模型作为DependencyProperty

我不想通过跳过第2部分将我的View XAML直接耦合到业务对象,这对我来说似乎不是一个干净的模式应用程序.也许这是错误的.

我本质上似乎需要在我的ViewModel中使用"传递DependencyProperty".

我的问题:

  • 这是正确的一般方法还是我认为这一切都错了?
  • 有没有使用这种传递方法的例子?
  • 有人能给出一个代码示例,说明在ViewModel和Model FieldA DependencyProperties之间创建传递绑定的正确方法吗?

Ste*_* Py 1

我自己也曾为这个问题苦苦挣扎,我想这是 MVVM 中一个非常常见的障碍。我的答案是避免使用DependencyObjector污染域INotifyPropertyChanged,因为它在某种程度上否定了使用 ViewModel 的有效性。

ViewModel 的目标是以与特定视图相关的方式公开模型。当虚拟机本质上需要公开整个域对象时,就会变得混乱。我将它们称为“编辑器”视图模型。这些是从域对象传递属性最有吸引力的。在这些情况下,我为 VM 提供对域对象(组合)的引用,并传递 getter 和 setter。如果 UI 需要刷新或显示验证错误,ViewModel 会采用INotifyPropertyChangedIDataErrorInfo而不是向 UI 发出信号。DependencyProperty如果域引发验证错误,则 VM 会捕获该错误并将其准备到视图的数据错误信息详细信息中。