自定义命令更新CanExecute(Custom Command update CanExecute

2019-09-19 22:01发布

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

但我这里主要的问题是,我并不想要拥有几乎每一行代码的我的一个电话

RaiseCanExecuteChanged()

方法。 所以,我能做什么做汽车一样RoutedUICommand一样。

我有很多数据绑定和作为例子,如果Foo.FooProp!= null命令可以执行。 但我想为更少的代码尽可能,所以我将不得不处处注册事件或更新命令都在我的应用....

Answer 1:

你可以实现的一种形式DelegateCommand它调用代表加入CanExecuteChanged每次有可能的结果是在UI的变化。 本例使用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工具?



Answer 2:

当我使用一个DelegateCommand ,我只是手动提高CanExecuteChangedPropertyChange事件每当属性命令依靠的变化。

下面是我做了前几天一个例子,其中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()当相关属性改变方法。



文章来源: Custom Command update CanExecute
标签: wpf command