2012-02-01 19 views
0

有點疑惑啓用DelegateCommand

如果我在一個WPF窗口有一個按鈕,並將其綁定到DelegateCommand

<Button Grid.Row="1" Content="Remove" Command="{Binding CommandDelete }" /> 

在我簡單的視圖模型附上

CommandDelete = new DelegateCommand<string>(OnDeleteExecute, OnDeleteCanExecute); 

如果按鈕是要啓用時,我從列表中選擇一個項目我可以綁定清單selecteditem屬性在我的viewmodel

Report selectedReport; 
      public Report SelectedReport 
      { 
       get { return this.selectedReport ;} 
       set { this.selectedReport = value;} 
      } 
private bool OnDeleteCanExecute(string commandParameter) 
      { 
       return (this.selectedReport != null); 
      } 

這似乎沒什麼問題,到目前爲止並唯一缺少的是在二傳手以增強對特定按鈕CanExecute事件SelectedReport

CommandDelete.RaiseCanExecuteChanged(); 

這工作,但我的問題是,如果我有10個按鈕做我需要一個項目被選中或者是有作爲

回答

1

通常我把我的RaiseCanExecuteChanged()PropertyChanged事件該類更聰明的方式,每次打電話RaiseCanExecuteChanged爲每一個按鈕。

例如,如果DeleteCommand.CanExecute是基於SelectedReport財產,我就幫到PropertyChanged事件ViewModel的,隨時隨地提高CanExecuteChanged事件SelectedReport變化。

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "SelectedReport") 
     DeleteCommand.RaiseCanExecuteChanged(); 
} 

這使所有的邏輯在一箇中心位置,並確保CanExecuteChanged被提出每當的參數改變之一。

另一種選擇是從使用DelegateCommand切換到RelayCommand,當屬性更改時會自動將其提升爲CanExecuteChanged。我會假設有一個性能差異,但從來沒有注意到一個。

+0

謝謝,實施它,像魅力一樣工作。保持代碼清潔一點 – klashagelqvist 2012-02-02 12:35:38

相關問題