0

在我的应用程序中使用菜单中的CanExecute参数时,我面临着两难境地。CommandBinding

情况如下:应用程序本身可以在某些模式下运行,例如工作模式、审查模式等。根据模式,一些菜单项应该启用或不启用(因此,应该可以执行或不执行)。

到目前为止我所做的是为 CanExecute 创建 4 个事件处理程序:

private void Mode1CanExecute(object sender, CanExecuteRoutedEventArgs e);
private void Mode1CannotExecute(object sender, CanExecuteRoutedEventArgs e);
private void Mode2CanExecute(object sender, CanExecuteRoutedEventArgs e);
private void Mode2CannotExecute(object sender, CanExecuteRoutedEventArgs e);

由于某些菜单命令对两种模式都是通用的,因此某些菜单命令是每种模式独有的。

随着应用程序的发展,有更多的因素决定此时是否应该执行特定的菜单命令。我能想到的解决方案是:

  • 向事件处理程序添加布尔多绑定CanExecute,但我找不到此解决方案的任何示例,我相信这是不可能的。
  • 为更长的名称添加更多的事件处理程序,CanExecute实际上会使代码的可读性降低
  • 具有“每个菜单项”CanExecute事件处理程序,并将每个事件处理程序的代码基于一些布尔变量来确定它的结果

我知道启用菜单项可以在SubmenuOpened事件处理程序中完成,但是对于许多命令也有一个KeyGesture定义。

我的问题是:在这种情况下,最佳实践是什么,因此应用程序的逻辑(命令执行可用性)得到保证,但代码可读性也保持在合理水平?

感谢您的任何建议。

4

2 回答 2

1

好吧,我所做的 -canexecute每个命令我总是有 1 个方法这样它简单且一致,你知道在哪里寻找问题

在 1 方法中使用它的另一点 - 只是纯粹的可测试性和可读性。

那么测试非常简单

public bool CanExecuteGoCommand(){
 if (xxx)
  return true;
 else
  return false;
}

并且该方法可以随心所欲,具有尽可能多的 If 条件,具有一百万个条件、模式、变量等。

于 2016-03-09T10:56:45.810 回答
0

我要做的是使用 DelegateCommand 或 RelayCommand 的实现作为 ViewModel 中的 ICommand 属性。其中任何一个都允许您将 Func 作为“CanExecute”委托传递给 ICommand 实例的构造函数。当您传入此 Func 时,您可以将 ViewModel 的其他属性包含为闭包,因此可以在委托中访问它们。这将允许您将 CanExecute 参数与 ViewModel 中的任何其他成员结合起来。

于 2016-03-09T12:16:48.947 回答