我目前正在玩MVVM模式和尝试命令。我发现默认方式(每个Command类需要从ICommand
接口实现)相当无聊,所以我创建了一个新的基类,等待它,CommandBase
。它看起来像这样:
public abstract class CommandBase : ICommand
{
public virtual bool CanExecute(object parameter)
{
return true;
}
public virtual event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public virtual void Execute(object parameter)
{
}
}
现在每个命令都只是从这个基类继承并覆盖了必要的内容。我在软件中有一个错误,所以我在继承类和这个基类中放了几个断点。一切似乎按预期工作,除了一件事 - 方法CanExecute
一直被解雇。如果我把断点放在方法中,我的应用程序甚至不会启动! 如果我删除此断点,一切都会重新开始。
MainViewModel:
public class MainViewModel : ViewModelBase // base implements INotifyPropertyChanged
{
public ICommand NavigateCommand { get; private set; }
public MainViewModel()
{
NavigateCommand = new NavigateCommand(this);
}
}
我的调试器到达构造函数,实例化Command类,从现在开始CanExecute方法就像疯了一样激发,我甚至无法打开应用程序窗口,因为vs调试器不会让我。在我的NavigateCommand中,我只覆盖Execute
方法并设置MainViewModel的一个属性,没什么太花哨的。 CanExecute
保持不变,但没有覆盖。
请注意,我提到的错误只是我的视图中的一个错误,它与此问题无关。在我修复它之后,除了这个东西之外,代码工作正常。
有人可以解释为什么它会像这样吗?
答案 0 :(得分:1)
这是一种“正常”行为,CanExecute
经常会CommandManager
被解雇。您不应该尝试调试此方法。如果出现未知错误,请在调试时打开Common Language Runtime Exceptions
- >例外情况......更多信息here。
答案 1 :(得分:1)
我可以建议,除非绝对必要,否则你不需要在这里重新发明轮子。您可以使用许多优秀的ICommand实现。
RelayCommand可能是最常用的,虽然DelegateCommand也很好实现,并且标准的ICommand实现是Prism框架。