【问题标题】:Custom Command update CanExecute自定义命令更新 CanExecute
【发布时间】:2012-07-20 13:34:40
【问题描述】:

我必须在 WPF 应用程序中使用此命令(我真的不喜欢它,但如果我必须 -> 我必须): http://wpftutorial.net/DelegateCommand.html

但我在这里遇到的主要问题是我不想在我的代码的几乎每一行中都调用

RaiseCanExecuteChanged()

方法。那么我该怎么做才能像 RoutedUICommand 那样自动完成呢。

我有很多数据绑定,例如如果 Foo.FooProp != null 命令可以执行。但我想要尽可能少的代码,所以我必须在所有地方注册事件或更新我的应用程序中的命令....

【问题讨论】:

    标签: wpf command


    【解决方案1】:

    当我使用DelegateCommand 时,只要命令依赖的属性发生更改,我只需在PropertyChange 事件中手动引发CanExecuteChanged

    这是我几天前做的一个例子,CanExecute 基于 IsLoadingIsValid 属性:

    public MyViewModel()
    {
        this.PropertyChanged += MyViewModel_PropertyChanged;
    }
    
    void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        switch (e.PropertyName)
        {
            case "IsLoading":
            case "IsValid":
                ((DelegateCommand)MyCommand).RaiseCanExecuteChanged();
                break;
        }
    }
    
    
    public ICommand MyCommand
    {
        get
        {
            if (_myCommand == null)
                _myCommand = new DelegateCommand(Run, CanRun);
    
            return _myCommand;
        }
    }
    
    public bool CanRun()
    {
        return this.IsValid && !IsLoading;
    }
    

    我发现这使得逻辑易于遵循和维护,并且它只在相关属性发生变化时检查CanExecuteChanged()方法。

    【讨论】:

    • 很高兴我找到了这个,它比专门为我到处调用 CanExecuteChanged 更好
    【解决方案2】:

    您可以实现DelegateCommand 的一种形式,每当UI 中可能的结果发生变化时,它就会调用添加到CanExecuteChanged 的委托。此示例使用CommandManager.RequerySuggested

    public class AutoDelegateCommand : DelegateCommand, ICommand
    {
        public AutoDelegateCommand(Action<object> execute)
            : base(execute)
        {
        }        
    
        public AutoDelegateCommand(Action<object> execute, Predicate<object> canExecute)
            : base(execute, canExecute)
        {
        }
    
        event EventHandler ICommand.CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
    }
    

    我想我以前见过这样的例子,也许是在 MVVMLight 工具包中?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多