【发布时间】:2011-11-10 10:39:30
【问题描述】:
我正在编写一个内部使用 MVVM 的 WPF 用户控件。为了开箱即用,它创建了自己的视图模型(这部分与问题无关)。
我的控件公开了许多依赖属性。主机视图(使用我的控件的人)可以设置这些 DP 或绑定到它们。其中一些 DP 具有相应的视图模型属性。
这就是我想要实现的(见图):我的控件视图中的 DP 绑定到视图模型的相应属性。此外,宿主视图也需要能够设置或绑定这些 DP——与使用任何其他控件的方式相同。
但是,一旦宿主视图设置或绑定了 DP 的值,原始绑定(内部绑定到控件的视图模型)就会丢失。这是因为每个 DP 只能有一个绑定集。所以这不起作用:
一种解决方案是使视图模型成为 DependencyObject 及其属性 DP。这样,我可以将控件的视图模型绑定到它的视图,而不是相反,有效地反转左箭头。但是,出于各种原因,我希望我的视图模型使用纯 C# 属性和 INotifyPropertyChanged。
关于如何将视图模型属性公开为外部可绑定依赖属性的任何想法?
编辑:
澄清要求:视图实际上并没有创建视图模型本身(我意识到这会违反关注点分离);相反,它使用视图模型定位器来执行此操作。 (这是一个非常模块化的企业应用程序。)我知道这不是一种典型的方法(请参阅 Rachel 的回答)。但是,接受所描述的设置,有什么方法可以达到预期的效果吗?
【问题讨论】:
-
你确定在这种情况下使用 MVVM 是合理的吗?也许它不是适合这项工作的工具。
-
同意@icebat。 VM 是关于业务逻辑的,业务逻辑不应该被封装在 UserControl 中。它应该是关于简化 UI 的一部分,因此只包含 UI 逻辑。我会考虑将拥有自己的 VM 的 UC 视为代码异味。
标签: wpf data-binding mvvm user-controls dependency-properties