2016-12-23 15 views
-1

XAMLのCommand属性を使用して、私は別の場所から発射されるコマンドRoutedUICommandをたくさん持っています。WPFコマンドはどこで処理できますか?

これらはすべて今すぐ私のMainWindow.xamlと私のMainWindow.xaml.csにバインドされています。私はそれぞれのハンドラを持っています。私はこの方法で設定しました。これは主にUnityでMainWindowクラスを解決し、必要なすべての依存関係(つまりドメインサービスなど)を受け取るためです。私はUserControlにコマンドをバインドする場合、私はそこで利用可能なこれらのサービスを持っていないだろうし、UserControlはDataContextが与えられているが、そのまたは別のコンテキストを操作することができます間違っているようです。

私の質問:これは正しいようですか?私にとっては、中央の1つの場所、特にメインウィンドウのコードのすべてのコマンドを処理することには何か不都合があります。

私はWPFを初めとしており、これが正しいかどうかはわかりません。アドバイスをいただければ幸いです。

+0

いくつかの背景情報を提供してください:あなたはMVVMパターンがになっている方法に精通しています作業? (あなたがまだ分かっていないのであればうれしいですが、MVVMに関連する言葉を単純に使用することができるかどうか、さらに詳しい説明がないか、少し冗長にする必要があるかどうかを知りたいだけです) –

+0

MVVMパターンではありますが、初めて使用します。私が知る限り、WPFはそれに最も適しているので、ここでそのパターンに従おうとしています。だから私はバインディングを持っていて、イベントはしていません。 –

答えて

2

ViewModelで処理する必要があります。 WPFアプリケーションの共通パターンはMVVMです。

  • M - モデル(すなわち、DB)
  • V - ビュー(の.xamlファイル)
  • VM - DataContextし、表示のために設定されているクラス。ここでバインドするすべてのロジックを実行する必要があります。

開発を簡略化できるMVVMフレームワークをいくつか見てみることをお勧めします。

人気のあるものは以下のとおりです。

+0

だから、レンダリングするはずのMainWindow.xamlにユーザコントロールを配置している場合、アイテムのリストを考えてみましょう。代わりにMainWindow.xamlからそのユーザコントロールに 'DataContext'を提供しません。ユーザーコントロールのVMはデータ自体を取得する必要がありますか? –

+0

@HristoYankovはい、UserControl自体が値を取得することがあります。しかし、寒いところには、データを取得してそれを子VMに渡す画面全体のVMもあります。達成したい粒度に依存します。すべての小さなコントロールがDBからデータを取得するのに意味がない場合があります。つまり、一部のデータを共有する可能性があるため、1か所で取得する方が良いです。 –

+0

私はMahApps Metroを使用していますので、Caliburn.Microを使用します。 Caliburn.Metroパッケージを入手する必要がありますか? –

1

WPFはのICommandインターフェイスの2つの実装を提供します。 System.Windows.Input.RoutedCommandおよびSystem.Windows.Input.RoutedUICommand(後者は前者のサブクラスで、コマンドを説明するTextプロパティを単純に追加します)。

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

コマンドロジックはビューモデルに存在する必要があるため、ビジュアル要素にコマンドを接続するために、コマンドバインディングをビューに設定しないでください。代わりに、ICommandを実装するクラスを作成して独自のコマンドを作成する必要があります。 Prism、MvvmLight、Caliburn MicroなどのすべてのMVVMライブラリには既にそのような実装があります。通常、DelegateCommandまたはRelayCommandと呼ばれます。コマンドとそれらをMVVM WPFアプリケーションで使用する方法の詳細については、次のリンクを参照してください。

MVVM - コマンド、RelayCommandsとEventToCommand:https://msdn.microsoft.com/en-us/magazine/dn237302.aspx

取り扱いMVVM WPFアプリケーションのイベント:https://blog.magnusmontin.net/2013/06/30/handling-events-in-an-mvvm-wpf-application/

関連する問題