2011-01-27 15 views
4

これでWPFコマンドの概念を理解しようとしています。 XAMLのコードではないものにコマンドを転送しようとするまでは、かなり簡単です。私はカスタムコマンドでこれを行ういくつかの方法を見てきましたが、組み込みのWPFコマンドでこれを行う方法の簡単な説明はありません。Use WPFコマンドとViewModelの組み合せ

RelayCommandクラスなどを使用してOpenコマンドをViewModelに転送する簡単な方法はありますか?

答えて

6

WPFの組み込みApplicationCommandsなどはもともとMVVMを意識して設計されていないため、ViewModelに入れようとすると実際には一致しません。 WPF 4では

あなたのViewModelにInputCommandsをバインドすることが可能になりました:

https://www.thomaslevesque.com/2009/10/26/vs2010-binding-support-in-inputbindings/

代替は、あなたが自分で実装するか、Prismのようなライブラリーから得ることができ、DelegateCommandsを使用することです。ビューモデル内のオブジェクトとしてDelegateCommandを定義し、ビューからバインドすることができます。

バインディングを実行したら、コマンドがビューモデルコードで何をするかを定義します。

+0

私は、これらのいずれかを使用しても私に無料のキーバインディングは与えられないと思います。 – s73v3r

+0

あなたはviewModelのコマンドに 'KeyBinding'をバインドできると信じていますが、正直言って私は' DelegateCommand'しか使用していませんでしたので、もっと完全な例はできません。 –

+0

更新されたリンク:https://www.thomaslevesque.com/2009/10/26/vs2010-binding-support-in-inputbindings/ – simonalexander2005

1

添付プロパティを使用して、ViewModelでビューにCommandBindingsを定義できるようにすることもできます。詳細については、私のブログの記事をチェックしてください:

CommandBindings with MVVM

2

あなたがWPFとMVVMをやっている場合は、私は強くなど、あなたを助けるためにフレームワークを見てお勧めします:

  1. Prism(提供)DelegateCommand独自の
  2. MVVM Light Toolkit(独自のRelayCommandを提供)
  3. Caliburn.Micro(私のお気に入り、アクションを提供します)
0

あなたのViewModelが新しいコマンドを公開しているとします。このようなコードで、Application.NewコマンドのバインディングをVMに再ルーティングできます。 XAMLで:

<Window.CommandBindings> 
    <CommandBinding Command="New" /> 
    ... 
</Window.CommandBindings> 

コードでは、このようなことができます。 (私は背後にあるコードのうち、コードを維持したいので、私はユーティリティクラスでこれを収容する。)

foreach (CommandBinding cb in CommandBindings) 
{ 
    switch (((RoutedUICommand)cb.Command).Name) 
    { 
     case "New": 
      cb.Executed += (sender, e) => ViewModel.New.Execute(e); 
      cb.CanExecute += (sender, e) => e.CanExecute = ViewModel.New.CanExecute(e); 
      break; 
    } 
} 

匿名メソッドはRoutedUICommandとのICommandの間にサンクを提供しています。

EDIT:また、ハンドラを追加するのではなくCommandManagerで明示的にコマンドバインディングを設定することをお勧めします。

CommandManager.RegisterClassCommandBinding(typeof(MainWindow), 
    new CommandBinding(ApplicationCommands.New, 
     (sender, e) => ViewModel.NewScore.Execute(e), 
     (sender, e) => e.CanExecute = ViewModel.NewScore.CanExecute(e))); 
関連する問題