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

本文关键字:静态 属性 绑定 按钮 命令 | 更新日期: 2023-09-27 18:25:50

我想将我的按钮绑定到非静态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中有没有任何方法可以将命令绑定到非静态属性?

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

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

将DataContext设置为ViewModel,

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

我怎么知道的?我怎么知道的?是因为我有魔法吗?嗯,我是,但这并没有告诉我。

这是显而易见的,因为当一个人创建一个视图模型来控制他们的用户控件时就会发生这种情况。它会破坏数据绑定并导致所有类型的故障。

想一想——TextBox有TextBoxViewModel吗?有TabViewModel吗?还是GridViewModel?不可以。对用户控件进行编码,就像它们是控件一样。

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

如果UC被设计为一个通用控件,可用于不同类型的视图模型,那么在其表面上公开控件需要操作的DependencyProperty。然后可以将这些绑定到视图模型。

或者,如果UserControl被设计为封装特定视图模型的UI(注意,UC是围绕视图模型设计的,视图模型不是为UC设计的),那么DataContext应该是视图模型,并且UC中的控件直接绑定到视图模型,而不是公开视图模型绑定的DP。

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

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

总之,解决办法就是不要做你正在做的事情。保持UC特定视图模型的解决方案非常棘手——在代码后台手动连接视图模型,创建一个伪DataContext来保存第二个视图模型。。。啊。它们都很糟糕,应该避免。放弃用户控件的视图模型。