2013-04-14 36 views
0

我目前正在尝试使用MVVM模式并尝试命令。我发现默认的方式(每个Command类需要实现从ICommand接口)很无聊,所以我创建了一个新的基类叫做,等待它,CommandBase。它看起来像这样:CanExecute断点不允许我使用应用程序

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); 
    } 
} 

我的调试器获取到构造函数,实例化的方法CanExecute火灾像疯了似的指挥类,从现在,我甚至不能打开应用程序窗口,因为与调试不让我。在我的NavigateCommand中,我只覆盖了Execute方法并设置了MainViewModel的一个属性,没什么太花哨。 CanExecute保持不变而不覆盖。

只是说明一点,我提到的错误只是我的视图的一个错误,它与这个问题没有关系。在我修好之后,代码就可以工作,除了这个东西。

有人可以提供解释为什么它的行为是这样的吗?

+0

看一看[这里](http://stackoverflow.com/a/14294916/2132796)。 – Herdo

+0

@Herdo,感谢您的链接,现在更清晰。如果我理解正确,解决此问题的唯一方法是尽可能缩短此方法以防止出现任何错误并忘记调试它? – walther

+0

是的,这是'正常的'行为,'CanExecute'被解雇了很多。 你不应该尝试用这种方法进行调试。如果出现未知错误,请在调试时打开“Common Language Runtine Exeptions” - >例外... – Herdo

回答

1

这是'正常'行为,CanExecute经常被CommandManager解雇。你不应该试图去调试这个方法。如果发现未知错误,请在Debug - > Exceptions ...中打开Common Language Runtime Exceptions ...更多信息here

1

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

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

+0

RelayCommand患有与我已经测试过的行为相同的行为,除它允许更方便地使用这些方法。但是,DelegateCommand似乎使用了不同的方法来提升事件,这很好。感谢您的建议,也为您+1。 – walther

相关问题