2012-07-20 126 views
2

我有一個WPF應用程序中使用此命令(我不喜歡它真的,但如果我要 - >我要): http://wpftutorial.net/DelegateCommand.html自定義命令更新CanExecute

但是我這裏的主要問題是,我並不想要在我的代碼幾乎每行具有對

RaiseCanExecuteChanged(通話)

方法。那麼我能做些什麼來像RoutedUICommand那樣做自動化。

我有很多數據綁定和例如Foo.FooProp!= null命令可以執行。但我希望儘可能少的代碼,所以我將不得不在任何地方註冊事件或更新我的應用程序中的所有命令....

回答

3

您可以實現一種形式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工具箱中?

4

當我使用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()方法,當相關屬性改變時。

+0

很高興我發現這個,它的wayyyy比專門爲我調用CanExecuteChanged更好 – 2013-11-15 15:11:08