首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将视图模型属性公开为可外部绑定的依赖属性?

如何将视图模型属性公开为可外部绑定的依赖属性?
EN

Stack Overflow用户
提问于 2011-11-10 10:39:30
回答 2查看 2.1K关注 0票数 3

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

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

这就是我想要实现的(见图):我的控件视图中的DPs绑定到视图模型的相应属性。此外,主机视图也需要能够设置或绑定这些DPs -与使用任何其他控件的方式相同。

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

一种解决方案是使视图模型成为DependencyObject及其属性DPs。通过这种方式,我可以将控件的视图模型绑定到它的视图上,而不是相反的方式,从而有效地逆转左箭头。但是,出于各种原因,我希望我的视图模型使用普通的C#属性和INotifyPropertyChanged。

对于如何将视图模型属性公开为外部绑定依赖属性,有什么想法吗?

编辑:

为了澄清需求:视图实际上并没有创建视图模型本身(我意识到这会违反关注点的分离);相反,它使用视图模型定位器来这样做。(这是一个非常模块化的企业应用程序。)我知道这不是一个典型的方法(见瑞秋的答案)。然而,接受所描述的设置,是否有任何方法来达到预期的结果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-11 09:39:19

所以情况是,您有VM和,它们必须是之间的数据绑定,VM可以t beDependencyObject``吗?嗯,三联VM主机是不可能的,AFAIK。

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

票数 1
EN

Stack Overflow用户

发布于 2011-11-10 14:03:53

如果我要为一个ViewModel创建一个CustomControl,那么预期用户将使用该ViewModel作为CustomControl.DataContext。其他任何时候,我的UserControl都没有与它们关联的ViewModels。

例如,假设我想要一个PopupControl。

我要么创建一个UserControl,其中包含代码中的所有自定义属性和逻辑--在UserControl后面(没有ViewModel)

代码语言:javascript
复制
<local:Popup Header="{Binding PopupHeader}"
             IsVisible="{Binding IsVisible}" />

我将创建一个PopupViewModel并构建我的PopupUserControl,希望DataContext将是PopupViewModel类型。

代码语言:javascript
复制
<DataTemplate DataType="{x:Type local:PopupViewModel}">
    <local:PopupView />
</DataTemplate>

<ContentControl Content="{Binding MyPopupViewModel}" />

IsVisiblePopupHeader这样的属性将存在于ViewModel中,而不是在PopupUserControl中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8078226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档