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

C# 将按钮命令绑定到非静态属性,c#,wpf,mvvm,commandbinding,C#,Wpf,Mvvm,Commandbinding,我想将我的按钮绑定到非静态ICommand属性。但我发现的所有例子似乎都只与静态属性有关 比如说。这是我到目前为止所做的 <Button Grid.Column="1" HorizontalAlignment="Right" Background="{DynamicResource Accent}" Margin="80,0" DataContext="{TemplateBinding LogoData}" Command="{Binding Source=

我想将我的按钮绑定到非静态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


将命令绑定为
,因为MyCustomCommand是ViewModel中包含的命令的属性名称。

引用另一个包含ICommand的项目

将DataContext设置为ViewModel


将命令绑定为
,因为MyCustomCommand是ViewModel中包含的命令的属性名。

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

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

考虑一下--TextBox是否有TextBoxViewModel?有TabViewModel吗?还是GridViewModel?否。将用户控件编码为控件

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

如果UC设计为一个通用控件,可用于不同类型的视图模型,则在其表面上显示控件需要操作的依赖性属性。然后可以将这些绑定到视图模型

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

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

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


总之,解决办法是不要做你正在做的事情。保持特定于UC的视图模型的变通方法非常麻烦——在codebehind中手动连接视图模型,创建一个伪DataContext来保存第二个视图模型。。。啊。它们都是坏的,应该避免。放弃用户控件的视图模型

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

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

考虑一下--TextBox是否有TextBoxViewModel?有TabViewModel吗?还是GridViewModel?否。将用户控件编码为控件

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

如果UC设计为一个通用控件,可用于不同类型的视图模型,则在其表面上显示控件需要操作的依赖性属性。然后可以将这些绑定到视图模型

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

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

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


总之,解决办法是不要做你正在做的事情。保持特定于UC的视图模型的变通方法非常麻烦——在codebehind中手动连接视图模型,创建一个伪DataContext来保存第二个视图模型。。。啊。它们都是坏的,应该避免。放弃用户控件的视图模型

您在何处声明您的
ICommand
?@HamletHakobyan它已在同一解决方案中的另一个项目中声明。好的,您在何处创建命令。@HamletHakobyan,位于ResourceDictionary中。它主要只是一个模板xaml,没有用于代码隐藏的.cs文件。亲爱的耶稣,你已经为用户控件创建了一个ViewModel,不是吗?你不是吗?!?!您在何处声明您的
ICommand
?@HamletHakobyan它已在同一解决方案中的另一个项目中声明。好的,您在何处创建命令。@HamletHakobyan,位于ResourceDictionary中。主要是临时工