我正在编写一个WPF用户控件,它内部使用MVVM。为了开箱即用,它创建了自己的视图模型(这个部分与问题无关)。
我的控件公开了许多依赖项属性。主机视图(无论谁使用我的控件)都可以设置这些DPs或绑定到它们。其中一些DPs具有相应的视图模型属性。
这就是我想要实现的(见图):我的控件视图中的DPs绑定到视图模型的相应属性。此外,主机视图也需要能够设置或绑定这些DPs -与使用任何其他控件的方式相同。
但是,一旦宿主视图设置或绑定了DP的值,原始绑定(将其内部绑定到控件的视图模型)就会丢失。这是因为每个DP只能有一个绑定集。所以这不管用:

一种解决方案是使视图模型成为DependencyObject及其属性DPs。通过这种方式,我可以将控件的视图模型绑定到它的视图上,而不是相反的方式,从而有效地逆转左箭头。但是,出于各种原因,我希望我的视图模型使用普通的C#属性和INotifyPropertyChanged。
对于如何将视图模型属性公开为外部绑定依赖属性,有什么想法吗?
编辑:
为了澄清需求:视图实际上并没有创建视图模型本身(我意识到这会违反关注点的分离);相反,它使用视图模型定位器来这样做。(这是一个非常模块化的企业应用程序。)我知道这不是一个典型的方法(见瑞秋的答案)。然而,接受所描述的设置,是否有任何方法来达到预期的结果?
发布于 2011-11-11 09:39:19
所以情况是,您有VM和,它们必须是之间的数据绑定,VM可以t beDependencyObject``吗?嗯,三联VM主机是不可能的,AFAIK。
一种可能的方法是在视图中复制一组DependencyProperties。原始属性将绑定到VM,并将影响视图的外观,重复的属性将绑定到主机,并以某种方式影响VM (例如,使用DP更改逻辑)。
发布于 2011-11-10 14:03:53
如果我要为一个ViewModel创建一个CustomControl,那么预期用户将使用该ViewModel作为CustomControl.DataContext。其他任何时候,我的UserControl都没有与它们关联的ViewModels。
例如,假设我想要一个PopupControl。
我要么创建一个UserControl,其中包含代码中的所有自定义属性和逻辑--在UserControl后面(没有ViewModel)
<local:Popup Header="{Binding PopupHeader}"
IsVisible="{Binding IsVisible}" />或
我将创建一个PopupViewModel并构建我的PopupUserControl,希望DataContext将是PopupViewModel类型。
<DataTemplate DataType="{x:Type local:PopupViewModel}">
<local:PopupView />
</DataTemplate>
<ContentControl Content="{Binding MyPopupViewModel}" />像IsVisible或PopupHeader这样的属性将存在于ViewModel中,而不是在PopupUserControl中。
https://stackoverflow.com/questions/8078226
复制相似问题