2009-03-03 21 views
2

ボタンから起動された組み込みの更新コマンドに応答したいViewModelクラスがありますが、CommandTargetの宣言方法がわかりません。WPFコマンドバインディングに応答するUI以外のオブジェクトの取得

public ViewModel() 
    { 
     CommandBinding binding = new CommandBinding(NavigationCommands.Refresh, CommandHandler); 
     binding.CanExecute += new CanExecuteRoutedEventHandler(binding_CanExecute); 
     binding.Executed += new ExecutedRoutedEventHandler(binding_Executed); 
     CommandManager.RegisterClassCommandBinding(typeof(ViewModel), binding); 
    } 
    void binding_Executed(object sender, ExecutedRoutedEventArgs e) 
    { 
     Debug.Print("Refreshing..."); 
    } 

    void binding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
    { 
     e.CanExecute = true; 
    } 

マークアップがある - - 今

<Button Command="Refresh">refresh</Button> 

、私が試した設定

簡単に言うと、私のコードは

のViewModelコンストラクタとCanExecute以下のようにして実行されるイベントハンドラですこのボタンのCommandTargetは{Binding Source={StaticResource ViewModel}}ですが、実行時間はCannot convert the value in attribute 'CommandTarget' to object of type 'System.Windows.IInputElement'です。

私はコマンドに慣れていないので、私はすべての種類が間違っている可能性があります。 Anyhelpに感謝します。

答えて

5

RoutedCommandとMVVMは混在しません。 RoutedCommandはビジュアルツリーに縛られており、WPFのCommandBindingsコレクションに依存しています。 MVVMパターンで動作する独自のICommandクラスを実装する必要があります。まずはPrism's implementationsをご覧ください。

  • DelegateCommand:私自身のMVVMプロジェクトで

    は、私は、コマンドの実装のカップルを持っています。コールは、コマンドを実行できるかどうかを判断するためにデリゲートを提供し、コマンドを実行します。

  • ActiveAwareCommand。インターフェイス(IActiveAware)と連携して動作し、現在実行中のアイテムにコマンドの実行を送信します。複数のアクティブ認識実装は、コマンドで自身を登録し、コマンドは自動的にCanExecute/Executeの呼び出しを現在アクティブな項目にルーティングします。
+0

ありがとうございました。それは助ける – Stimul8d

関連する問題