自定义命令更新CanExecute

时间:2012-07-20 13:34:40

标签: wpf command

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

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

  

RaiseCanExecuteChanged()

方法。那么我可以做什么来做像RoutedUICommand那样的自动呢。

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

2 个答案:

答案 0 :(得分:4)

当我使用DelegateCommand时,只需在命令依赖于更改的属性时手动提升CanExecuteChanged事件中的PropertyChange

以下是我几天前所做的一个示例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()方法。

答案 1 :(得分:3)

您可以实现一种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工具包中?