【发布时间】:2014-02-08 15:31:23
【问题描述】:
好的。这是场景。这是 WPF + MVVM (.net 4.0) 应用程序:
- 视图:有一个
DataGrid和两个按钮Move Up / Move Down,它们应该在DataGrid中向上或向下移动选定的记录。网格和按钮都使用基于 XAML 的绑定。 - ViewModel:有一个
DataView类型的公共属性,我的DataGrid将绑定到该属性。然后下面列出了两个ICommand实现。这两个按钮将绑定到这两个命令。最后但同样重要的是,有两个函数称为MoveUp()和MoveDown(),它们的作用显而易见。 - 两个
ICommand实现:在每个命令中,CanExecute()分别返回选择的记录是否可以向上或向下移动,Execute()实际上是通过调用ViewModel的MoveUp()和MoveDown()函数来移动记录我上面描述的.这些命令对象在其构造函数中获取 VM 对象的引用。
首先,我想知道这个架构是否正确并符合 MVVM 模式?其次,手头的问题是,当我更改 DataGrid 中的选定记录时,我的按钮没有启用/禁用,这带来了 2 个子问题:
- 谁打电话给
CanExecute(),什么时候打电话? - 如何手动调用它?在阅读了其他一些 SO 问题后,我尝试了
CommandManager.InvalidateRequerySuggested(),但这也无济于事。
这是我的 CommandBase 类,我的两个 Command 类都继承自该类:
internal abstract class CommandBase : DependencyObject, ICommand
{
public virtual bool CanExecute(Object parameter)
{
return true;
}
public abstract void Execute(Object parameter);
public event EventHandler CanExecuteChanged;
protected void OnCanExecuteChanged(Object sender, EventArgs e)
{
CanExecuteChanged(sender, e);
}
}
【问题讨论】:
-
您使用的是哪个版本的
ICommand? -
版本是什么意思?
System.Windows.Input(PresentationCore.dll 4.0.0) 中只有一个ICommand。 -
是的,我的意思是
DelegateCommand或RelayCommand或您自己的ICommand派生实现? -
嗯...不确定。我在上面粘贴我的
CommandBase类。我所有的具体命令类都继承自它。 -
CanExecute方法总是从基类方法返回 true。我希望您在具体的命令实现中将其设置为实际的Predicate,否则命令CanExecute将始终返回true,并且永远不会禁用按钮。