2012-02-01 8 views
0

リトル私はWPFウィンドウにボタンがある場合はDelegateCommand

を困惑有効にして、私はボタン場合

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

を添付DelegateCommand

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

にそして、私の簡単なのviewmodelにバインドリストから項目を選択すると有効になります。リストの項目を自分のビューモデルのプロパティにバインドできます。

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

これは、これまでのところ私には罰金だと不足している唯一のことは、これは動作しますが、私は10のボタンを持っている場合は、私の質問は何されてSelectedReport

CommandDelete.RaiseCanExecuteChanged(); 

用セッターで特定のボタンのCanExecuteイベントを高めることですアイテムが選択されるたびに、または賢い方法があるたびに、各ボタンごとにRaiseCanExecuteChangedを呼び出す必要があります。

答えて

1

通常、私はRaiseCanExecuteChanged()をそのクラスのPropertyChangedイベントに配置します。例えば

DeleteCommand.CanExecuteSelectedReport性質に基づいている場合、私はViewModelPropertyChangedイベントにフックして、いつでもSelectedReport変更をCanExecuteChangedイベントを発生させるでしょう。

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

これは、1つの中央の場所ですべてのロジックを保持し、パラメータの変更のたび1 CanExecuteChangedを上げますが保証されます。

もう1つの方法は、DelegateCommandRelayCommandに切り替えることです。これは、プロパティが変更されると自動的にCanExecuteChangedになります。パフォーマンスの違いはあると思いますが、気づいたことはありません。

+0

ありがとうございます、それを実装し、魅力的に動作します。コードを少しきれいにする – klashagelqvist

関連する問題