2

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

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

RaiseCanExecuteChanged()

方法。那么我该怎么做才能像 RoutedUICommand 那样自动执行该操作。

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

4

2 回答 2

4

当我使用 a时,只要命令依赖的属性发生更改DelegateCommand,我就手动引发事件。CanExecuteChangedPropertyChange

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

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()在相关属性更改时才检查方法。

于 2012-07-20T15:31:55.810 回答
3

您可以实现一种表单,每当 UI 中可能的结果发生变化时,DelegateCommand它就会调用添加到的委托。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 工具包中?

于 2012-07-20T13:44:44.077 回答