WPF 可以执行取决于多个因素



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

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

到目前为止,我所做的是为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

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

感谢您的任何建议。

好吧,

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

一种方法中拥有它的另一点 - 只是纯粹的可测试性和可读性。

然后测试非常简单

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

方法可以随心所欲地大,只要你需要多少个 If,就有一百万个条件、模式、变量等。

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

最新更新