c# - ViewModel 是否应该具有绑定(bind)到模型上的 DependencyProperties 的直通 DependencyProperties?

标签 c# wpf mvvm

我是 WPF/MVVM 的新手,我发现的示例似乎没有涵盖我面临的问题。

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

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

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

我可能是错的,但我认为我应该将这些规则封装在业务类中,因为这些规则与其说是关于屏幕,不如说是关于实体。

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

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

我了解如何从 View 到 ViewModel 进行数据绑定(bind)。

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

鉴于我两次遇到基本相同的问题,我认为应该采用一种解决方案。所以我将我的模型类变成了 DependencyObject,并将它的属性变成了 DependencyProperties。

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

  1. View 作为数据绑定(bind)到 ViewModel.FieldA 的可视化组件,例如 text="{Binding FieldA, Mode=TwoWay}"
  2. ViewModel 作为 DependencyProperty“向上”绑定(bind)到 View ,“向下”绑定(bind)到模型
  3. 模型作为依赖属性

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

我的 ViewModel 中似乎基本上需要一个“直通 DependencyProperty”。

我的问题:

  • 这是正确的一般方法还是我的想法全错了?
  • 是否有使用这种传递方法的示例?
  • 有人可以提供一个代码示例,说明在 ViewModel 和模型 FieldA DependencyProperties 之间创建传递绑定(bind)的正确方法吗?

最佳答案

我自己也在努力解决这个问题,我认为这是 MVVM 的一个非常常见的问题。我的回答是避免使用 DependencyObjectINotifyPropertyChanged 污染域,因为它在某种程度上否定了使用 ViewModel 的有效性。

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

关于c# - ViewModel 是否应该具有绑定(bind)到模型上的 DependencyProperties 的直通 DependencyProperties?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13573696/

相关文章:

wpf - 我可以从 WPF 窗口获取 HDC 以便我可以使用 Gdi+ API 绘制它吗?

c# - 如何使用多个依赖属性绑定(bind)到计算属性

wpf - 我的 URI 必须这么长和明确吗?

c# - WPF MVVM 加载时的焦点字段

android - 如何从android中的viewmodel调用baseactivity函数

c# - MEF 如何设法实例化作为外部程序集的内部类的导出部件?

c# - 批评这个 C# Hashmap 实现?

c# - 泛型派生

c# - 图书馆youtubeExtractor给我一个错误

c# - 如何检索 WPF TabControl 的项目内容?