wpf - 如何将 View 模型属性公开为外部可绑定(bind)的依赖属性?

标签 wpf data-binding mvvm user-controls dependency-properties

我正在编写内部使用 MVVM 的 WPF 用户控件。为了开箱即用,它创建了自己的 View 模型(这部分与问题无关)。

我的控件公开了许多依赖属性。宿主视图(无论谁使用我的控件)都可以设置这些 DP 或绑定(bind)到它们。其中一些 DP 具有相应的 View 模型属性。

这就是我想要实现的(见图表):我控件 View 中的 DP 绑定(bind)到 View 模型的相应属性。此外,主机 View 也需要能够设置或绑定(bind)这些 DP——就像您使用任何其他控件一样。

但是,一旦宿主视图设置或绑定(bind) DP 的值,原始绑定(bind)(将其内部绑定(bind)到控件的 View 模型)就会丢失。这是因为每个 DP 只能有一个绑定(bind)集。所以这是行不通的:

Diagram of what doesn't work

一种解决方案是使 View 模型成为 DependencyObject 及其属性 DP。这样,我可以将控件的 View 模型绑定(bind)到它的 View ,而不是相反,有效地反转左箭头。但是,出于各种原因,我希望我的 View 模型使用纯 C# 属性和 INotifyPropertyChanged。

关于如何将 View 模型属性公开为外部可绑定(bind)依赖属性的任何想法?

编辑:

澄清需求: View 实际上并没有创建 View 模型本身(我意识到这会违反关注点分离);相反,它使用 View 模型定位器来执行此操作。 (这是一个非常模块化的企业应用程序。)我知道这不是典型的方法(请参阅 Rachel 的回答)。然而,接受所描述的设置,有什么方法可以达到预期的结果吗?

最佳答案

所以情况是您有 VM 和 View,它们必须彼此数据绑定(bind),而 VM 不能是 DependencyObject?好吧,AFAIK,三重绑定(bind) VM-V-Host 是不可能的。

一种可能的方法是在 View 中复制一组 DependencyProperties。原始属性将绑定(bind)到 VM 并将影响 View 的外观,重复属性将绑定(bind)到 Host 并以某种方式影响 VM(例如,使用 DP 更改逻辑)。

关于wpf - 如何将 View 模型属性公开为外部可绑定(bind)的依赖属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8078226/

相关文章:

c# - 具有网格布局的自定义 ItemsControl

c# - Kinect SDK 1.7 - 如何用双手工作

Grails Action 参数日期绑定(bind)

java - 在@RequestParam 中绑定(bind)一个列表

javascript - 使用 Knockout 映射插件在子数组成员上定义计算可观察量

c# - WPF 列表框超出屏幕大小(MVVM 灯)

c# - 如何将 Entity Framework 中的数据绑定(bind)到数据网格?

c# - 如何将列表框选定的项目分配给源属性

WPF 新 View 与 FindResource

c# - 将依赖属性绑定(bind)到当前 DataContext 属性