CanExecute断点不允许我使用该应用程序

时间:2013-04-14 16:21:41

标签: c# mvvm icommand

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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