1

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

我找到了两个解决方案:

使用中继命令:

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

亲:?;对比:如果我要更改诸如焦点之类的 ui 元素,则需要解决事件

附带行为:

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));

亲:你有 RoutedEventArgs 用于 ui 上的更改;对比:访问其他控件?

现在我使用这两种解决方案。按钮中的 RellayCommand(带有用于 ui 更新的事件)和树视图的附加行为,以在用户单击时取消选择树视图项。

4

2 回答 2

1

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

  • 如果您在 VM 上定义了状态更改,请公开一个 RelayCommand,然后可以将其绑定到触发它的东西。在 99.9% 的情况下,这是一个按钮/菜单项。可以轻松使用的东西。剩下的情况-> 可能需要一些解决方法,例如从视图中调用方法。因此,如果您确实针对 VM,则应该使用 RelayCommand。

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

hth,马丁

于 2011-04-12T14:21:01.477 回答
1

我喜欢这个主意:

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            
    }
于 2011-09-15T12:10:40.593 回答