将按钮命令绑定到非静态属性

时间:2015-12-05 15:27:40

标签: c# wpf mvvm commandbinding

我想将我的按钮绑定到非静态ICommand属性。但似乎我发现的所有例子都只与静态属性有关。

例如。这是我到目前为止所管理的内容

<Button Grid.Column="1" HorizontalAlignment="Right" Background="{DynamicResource Accent}" Margin="80,0"
        DataContext="{TemplateBinding LogoData}"
        Command="{Binding Source={x:Static materialMenu:SideMenu.OpenSidebar}}">
    <Path Data="{Binding}" Stretch="Fill" Fill="White" Width="24" Height="24" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Button>

上面的命令绑定只允许我绑定到静态命令属性。 下一个也是如此;

<Button Grid.Column="1" HorizontalAlignment="Right" Background="{DynamicResource Accent}" Margin="80,0"
        DataContext="{TemplateBinding LogoData}"
        Command="materialMenu:SideMenu.OpenSidebar"
        CommandParameter="{Binding}">
    <Path Data="{Binding}" Stretch="Fill" Fill="White" Width="24" Height="24" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Button>

所以我的问题是:由于我的数据上下文已经设置为另一个类,wpf中有没有办法将命令绑定到非静态属性?

2 个答案:

答案 0 :(得分:0)

引用另一个包含ICommand的项目,

将DataContext设置为ViewModel,

将命令绑定为<Button Command="{Binding MyCustomCommand}" .../>,因为MyCustomCommand是ViewModel中包含的命令的属性名称。

答案 1 :(得分:0)

我怎么知道?我怎么知道的?是因为我很神奇吗?好吧,我是,但那并没有告诉我。

很明显,因为当创建视图模型来控制用户控件时会发生这种情况。它搞砸了数据绑定并导致各种类型的麻烦。

想一想 - TextBox是否有TextBoxViewModel?有TabViewModel吗?还是GridViewModel?编号。您的用户控制代码,就像他们是一个控件

要解决这个问题,首先要做的就是摆脱那个视图模型。将UI逻辑移动到用户控件的代码隐藏中。接下来会发生什么取决于用户控制的目标。

如果UC被设计为通用控件,可用于不同类型的视图模型,则在其表面上公开DependencyProperties以了解控件需要操作的内容。然后,您可以将这些绑定到视图模型。

或者,如果您的UserControl旨在封装特定视图模型的UI(注意 - UC是围绕视图模型设计的,视图模型不是为UC设计的),那么DataContext应该是视图模型,而不是暴露视图模型绑定到的DP,UC中的控件直接绑定到视图模型。

第一种控件的示例是显示列表中元素的UI项,该列表包含具有不同属性的不同类型的视图模型。该控件包含编辑/删除按钮,并显示在基类中定义的属性的内容,所有这些属性都绑定到不同视图模型的不同元素。显示信息绑定到列表中的视图模型,按钮命令绑定到公共父视图模型。

第二种类型的示例是应用程序中用于不同位置的特定类型视图模型的编辑器。

总之,解决方案是不做你正在做的事情。保持你的UC特定视图模型的变通方法很糟糕 - 手动连接代码隐藏中的视图模型,创建一个伪DataContext来保存第二个视图模型......呃。它们都很糟糕,应该避免。抛弃用户控件的视图模型。