2017-01-31 1 views
4

私は自分のアプリケーションでMVVMに苦労しています。私はTabControlを持っています。TabControlはすべてのタブが何らかの形でファイルを編集できるコントロールをホストしています。例えば、テキストファイルまたは画像。各コントロールは、ViewModel領域のクラスにバインドされています(図のように)。私はRoutedUICommandsも持っています。これらのコマンドの1つはワードラップで、テキストファイルの場合にのみ意味があります。このコマンドは、MenuItemやButtonなどで使用されています。テキストコントロールがこのコマンドのターゲットである場合にのみ有効にしたいと思います。どのようにMVVMに応じて適切にそれを行うには?MVVM内のルーティングされたUIComm

詳細:Windowの

diagram image

XAMLあり:メニュー項目をこのように使用され

<Window.CommandBindings> 
<CommandBinding Command="local:EditorCommands.WordWrap" 
    Executed="WordWrapExecuted" 
    CanExecute="CommandCanBeExecutedWhenAnythingIsOpen"/> 
</Window.CommandBindings> 

<MenuItem Command="local:EditorCommands.WordWrap"/> 

を最初にすることが実行されますCanExecuteイベントハンドラ:ウィンドウクラスにありますが、私のMVVMであるかどうかを理解するには、ロジックがViewModelのみである必要があります。

さらに、これらの機能の送信者は、ウィンドウのインスタンスです。なぜそれはコマンドの目標ではないのですか?

すべてのコマンドで自分の後継者をRoutedUICommandに書きますか?

答えて

1

A は、フォーカスされた要素からビジュアルツリーを検索し、CommandBindingsコレクションに一致するSystem.Windows.Input.CommandBindingオブジェクトを持つ要素を検索し、このためにExecuteデリゲートを実行するため、ビューモデルで実際に使用するのに適していません。特にCommandBinding。

コマンドロジックはビューモデルに存在する必要があるため、ビジュアル要素にコマンドを接続するために、コマンドバインディングをビューに設定しないでください。

代わりに、ICommandインターフェイスの独自の実装を作成するか、そこにあるMVVMフレームワークのいずれかで使用できるインタフェースを使用する必要があります。例えば、MvvmLightは、RelayCommandクラス:https://msdn.microsoft.com/en-us/magazine/dn237302.aspxを有する。

How to use RelayCommand with the MVVM Light framework

とプリズムにそれがDelegateCommandと呼ばれている: https://www.codeproject.com/Articles/1055060/DelegateCommand-and-CompositeCommand-in-Prism

MVVMでのコマンドの詳細については、以下のブログ記事を参照してください:https://blog.magnusmontin.net/2013/06/30/handling-events-in-an-mvvm-wpf-application/

関連する問題