如何附加命令以检查和取消选中CheckBox?

Gra*_*meF 7 data-binding wpf xaml mvvm

在我的ViewModel中,我有两个命令:

ICommand ExecuteMeOnCheck { get; }
ICommand ExecuteMeOnUncheck { get; }
Run Code Online (Sandbox Code Playgroud)

我希望将这些命令附加到CheckBox,并在检查时执行其中一个命令,而在取消选中时执行另一个命令.在没有使用代码隐藏的视图混乱的情况下实现这一目标的最佳方法是什么?

Tim*_*mje 14

我用"IsChecked"上的Trigger设置了命令.

例如

<Style x:Key="checkBoxStyle" TargetType="{x:Type CheckBox}">
      <Style.Triggers>
        <Trigger Property="IsChecked" Value="True">
          <Setter Property="Command"
                  Value="{Binding AddThingCommand}" />
        </Trigger>
        <Trigger Property="IsChecked" Value="False">
          <Setter Property="Command"
                  Value="{Binding RemoveThingCommand}" />
        </Trigger>
      </Style.Triggers>
    </Style>
Run Code Online (Sandbox Code Playgroud)


小智 3

我发现做到这一点的最简单方法是借用一堆代码。我还认为您不想公开状态更改的两个事件。将命令设为 CheckedChangedCommand 而不是 Checked 和 Unchecked。将 CheckBox.IsChecked 依赖项属性绑定到 ViewModelClass 上的属性。这样,当您的命令被执行时,您只需检查 ViewModel 中的该值。

首先,开始使用WPF ViewModel 工具包中的 DelegateCommand 。从你的帖子中并不清楚你是否是。

接下来,从此链接的“下载”选项卡下载.zip 存档。

该存档有一个名为 EventBehaviourFactory 的类,可以更轻松地设置 DependencyProperty。返回上面链接的“主页”选项卡,Samuel 告诉您如何将 XAML 中的命令连接到 ViewModel。这里是:

<TextBox ff:TextBoxBehaviour.TextChangedCommand="{Binding TextChanged}"/>
Run Code Online (Sandbox Code Playgroud)

我逐行使用了三个类(DelegateCommand、EventBehaviourFactory 和 TextBoxBehaviour),并在大约五分钟内让 TextChanged 事件在我的项目中运行。

将其扩展到您需要做的其他控件的模式也很简单。我设法以相同的方式连接 ListBox.SelectionChanged 。创建一个新的 ControlBehaviour 类,并在所有实例中用“Control”替换“TextBox”,并将 DependencyProperty 附加到新事件。

当你的代码后面是空的时,这是一件美妙的事情!