0

我目前正在玩弄 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保持不变而没有覆盖。

请注意,我提到的错误只是我的视图的错字,与此问题无关。在我修复它之后,除了这个东西之外,代码都可以工作。

有人可以解释为什么它会这样吗?

4

2 回答 2

1

我是否可以建议,除非绝对必要,否则您不需要在这里重新发明轮子。您可以使用许多出色的 ICommand 实现。

RelayCommand可能是最常用的,虽然DelegateCommand实现也很好,而且是标准的 ICommand 实现是 Prism 框架。

于 2013-04-15T14:39:25.583 回答
1

这是一种“正常”行为,CanExecute经常被CommandManager. 您不应该尝试调试此方法。如果出现未知错误,请Common Language Runtime Exceptions在 Debug -> Exceptions...此处打开更多信息。

于 2013-04-14T17:17:16.073 回答