在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。
答案 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
}