在MVVM中处理点击事件的最佳方法是什么?

时间:2011-04-12 13:33:36

标签: wpf mvvm relaycommand attachedbehaviors

在MVVM中进行handel点击事件的最佳方法是什么?有最好的方法吗?

我找到了两个解决方案:

使用relaycommand:

RelayCommand buttonAddCategory_Click;
public ICommand ButtonAddCategory_Click
{
    get
    {
        return buttonAddCategory_Click ?? (buttonAddCategory_Click = new RelayCommand(param => this.AddCategory(),
                                                                                      param => true));
    }
}

亲:?; contra:如果我要更改ui元素like focus

,需要解决事件

附加行为:

public static bool GetIsResetMouseLeftButtonDown(TreeView treeView)
{
    return (bool)treeView.GetValue(IsResetMouseLeftButtonDownProperty);
}
public static void SetIsResetMouseLeftButtonDown(TreeView treeViewItem, bool value)
{
    treeViewItem.SetValue(IsResetMouseLeftButtonDownProperty, value);
}
public static readonly DependencyProperty IsResetMouseLeftButtonDownProperty =
    DependencyProperty.RegisterAttached("PreviewMouseLeftButtonDown", typeof(bool), typeof(TreeViewBehavior),
    new UIPropertyMetadata(false, OnIsMouseLeftButtonDownChanged));

亲:你有更改ui的RoutedEventArgs; contra:访问其他控件?

现在我使用两种解决方案。按钮中的RellayCommand(包含ui更新的事件)以及树视图的附加行为,以便在用户单击时取消选择treeviewitem。

2 个答案:

答案 0 :(得分:1)

对我来说,这个问题没有简单的答案。 这就是我看到它的方式:

  • 如果您在VM上有一个已定义的状态更改,则公开一个RelayCommand,然后可以将其绑定到触发它的内容。在99.9%的情况下,这是一个按钮/菜单条目。可以轻松使用的东西。留下的案例 - >好吧可能需要一些解决方法,比如从视图中调用方法。 因此,如果您真正针对虚拟机,则应该使用RelayCommand。

  • 另一方面,焦点更改是与视图相关的功能。 Imho这与WM没什么关系。这对我来说意味着它应该在视图中实现。所以对我来说,我甚至会选择一位直接的事件处理程序来完成这项工作。

HTH, 马丁

答案 1 :(得分:0)

我喜欢这个想法:

UI逻辑,例如打开新窗口,显示/隐藏元素等。您可以将其保留在代码隐藏中。

当“点击”应该对模型做某事时,请调用该动作。

因此,关闭窗口并保存某些内容的按钮将如下定义:

<Button  Name="SaveBtnr" VerticalAlignment="Bottom" 
        Command="{Binding Save}" Click="OnSaveClick"
        CommandParameter="{Binding}">Save</Button>

处理程序将是:

private void OnSaveClick(object sender, RoutedEventArgs e)
    {
        //Do UI Stuff
    }

然后你的命令:

  public void SaveCommand(object parameter)
    {
        //SaveStuff            
    }