【发布时间】:2013-04-14 16:21:40
【问题描述】:
我目前正在玩弄 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 一直被解雇。如果我将断点放在方法中,我的应用程序甚至都不会启动! 如果我删除这个断点,一切都会恢复正常。
主视图模型:
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 保持不变而不会被覆盖。
请注意,我提到的错误只是我的视图的拼写错误,与此问题无关。在我修复它之后,除了这个东西之外,代码都可以工作。
有人可以解释为什么它会这样吗?
【问题讨论】:
-
看看here。
-
@Herdo,谢谢你的链接,现在更清楚了。如果我理解正确的话,解决这个问题的唯一方法就是尽可能缩短这个方法,以防止出现任何错误而忘记调试它?
-
是的,这是一种“正常”行为,
CanExecute经常被解雇。您不应该尝试在此方法中进行调试。如果出现未知错误,请在 Debug -> Exceptions... 处打开Common Language Runtine Exeptions... -
好的,谢谢。从您的 cmets 发布此信息作为答案,以便我可以选择它:) 我想我应该非常小心在这个 CanExecute 方法中放入什么......