【问题标题】:CanExecute breakpoint doesn't allow me to use the applicationCanExecute 断点不允许我使用该应用程序
【发布时间】: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 方法中放入什么......

标签: c# mvvm icommand


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • RelayCommand 的行为与我已经测试过的行为相同,但它允许更轻松地使用这些方法。但是,DelegateCommand 似乎使用不同的方法来引发事件,这很好。感谢您的建议,也为您 +1。
    猜你喜欢
    • 2018-05-22
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    相关资源
    最近更新 更多