绑定到CheckBox并以MVVM方式执行命令

时间:2010-10-08 17:28:29

标签: c# wpf mvvm binding

我有一个类似于this one的问题,但是在更详细的情况下。我也尝试使用Model View Viewmodel模式实现解决方案。

MainView中,我有一个按钮,用于调用存储在Execute中的命令(我们将其称为MainViewModel)。我还希望在单击鼠标左键时调用此命令(实际上,仅在Up上),但仅在选中MouseUpCheckBox时调用。

当我在视图中包含所有代码时,我为Execute执行了静态绑定,但随后使用ElementName绑定到Window(名为w_window)for { {1}}并检查IsChecked处理程序中的属性值。

XAML

MouseLeftButtonUpEvent

C#

<Button Command="{x:Static local:MainView.Execute}">
    Execute
</Button>
<CheckBox IsChecked="{Binding ElementName=w_window, Path=ExecuteOnMouseUp}">
    Execute on Mouse Up
</CheckBox>

如何将此代码从我的视图移植到viewmodel中?我应该使用附属物吗?有没有办法将复选框值绑定到public MainView() { InitializeComponent(); this.CommandBindings.Add(new CommandBinding(Execute, ExecuteExecuted)); MyDesigner.AddHandler(UIElement.MouseLeftButtonUpEvent, new RoutedEventHandler((o, eventArgs) => { if (ExecuteOnMouseUp) { Execute.Execute(null, this); } }), true); } #region ExecuteOnMouseUp /// <summary> /// ExecuteOnMouseUp Dependency Property /// </summary> public static readonly DependencyProperty ExecuteOnMouseUpProperty = DependencyProperty.Register("ExecuteOnMouseUp", typeof(bool), typeof(MainView), new FrameworkPropertyMetadata((bool)false)); /// <summary> /// Gets or sets the ExecuteOnMouseUp property. This dependency property /// indicates .... /// </summary> public bool ExecuteOnMouseUp { get { return (bool)GetValue(ExecuteOnMouseUpProperty); } set { SetValue(ExecuteOnMouseUpProperty, value); } } #endregion #region Execute /// <summary> /// The Execute command .... /// </summary> public static RoutedUICommand Execute = new RoutedUICommand("Execute", "Execute", typeof(MainView)); private void ExecuteExecuted(object sender, ExecutedRoutedEventArgs e) { ... } #endregion Command处理程序中的参数?什么是惯用的WPF / MVVM处理这种情况的方式?

3 个答案:

答案 0 :(得分:2)

查看this文章。它向您展示了如何构建一个AttachedCommand,它将让您完成您想要完成的任务。

答案 1 :(得分:0)

在我看来,对于像绑定到Button或CheckBox这样简单的任务,你的例子看起来有点复杂。

您可以查看 WPF Application Framework (WAF) ViewModel 示例应用程序。它展示了如何以MVVM友好的方式将IsChecked属性绑定到ViewModel。

答案 2 :(得分:0)

Rachel在上面提供了一个非常好的解决方案,但为了理解,我提供了她提到的不同方法的详细信息(再次感谢@Rachel)。

<...
 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
...>
<i:Interaction.Triggers>
    <i:EventTrigger EventName="ExecuteOnMouseUp">
        <i:InvokeCommandAction Command="{Binding Execute}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

我尝试了两者,发现在处理路由事件方面存在一些差异。但总的来说,这两种方法都像魅力一样。