2

私はWPFアプリケーションでこのコマンドを使用する必要があります(私は本当に好きではありませんが、もし私がしなければならないなら - >私はしなければなりません): http://wpftutorial.net/DelegateCommand.html

しかし、ここで私が抱えている主な問題は、コードのほぼすべての行に、

RaiseCanExecuteChanged()

方法。では、RoutedUICommand のように自動で行うにはどうすればよいでしょうか。

私は多くのデータバインディングを持っており、例として Foo.FooProp != null コマンドを実行できます。しかし、コードをできるだけ少なくしたいので、どこでもイベントを登録するか、アプリケーション全体でコマンドを更新する必要があります....

4

2 に答える 2

4

When I use a DelegateCommand, I just manually raise the CanExecuteChanged in the PropertyChange event whenever a property the command relies on changes.

Here's an example I did a few days ago where the CanExecute was based off the IsLoading and IsValid properties:

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;
}

I find this keeps the logic easy to follow and maintain, and it only checks the CanExecuteChanged() method when the relevant properties change.

于 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 に答える