WPF で MVVM パターンを採用し始めており、これまでに ViewModel を View から分離し、Command
クラスを作成しました。ただし、すべての場合において、最初に View を初期化し、コード ビハインドで ViewModel を生成します。MVVM の利点を十分に探求していないと思います。たとえば、新しい UI コンポーネントを によって生成する必要がある場合、Command
はCommand
ViewModel と View を混在させます。これは、ViewModel と View の両方を認識して両方を作成する必要があるためです。明確な分離はありません。
そして今、この問題に関連していると思われる別の問題があります。WPF アプリケーションでは、同じマシン内の別のアプリケーションからの要求を受け取り、対応する WPF コントロールを初期化する WCF サービスをホストする必要があります。非 UI スレッドでサービスをホストしているため ( のコード ビハインドにホストを配置したくないUserControl
)、ホスティング スレッドで結果UserControl
を生成することはできません。したがって、ViewModel を初期化してから、対応する View を解決する必要があると思います。
MEF を依存性注入として使用し、EventAggregator を使用して新しい ViewModel の生成を通知することについて、以前にいくつかの経験があります。しかし、それは私たちの現在のプロジェクトに多くの変更をもたらすので、ビューを解決するための他のオプションはありますか?
これまでのところ、UI はまだかなりシンプルですが、長期的には洗練された UI を作成する必要があります。しかし、さらなる質問は、洗練された UI に MVVM パターンを採用するために、MEF/Unity を常に使用する必要があるかどうかです。ViewModel と View を分離するために、それらは必須のようなものだと感じています。私は正しいですか?
アップデート:
ViewModel をレンダリングする方法を XAML に指示する DataTemplate を単純に持つことができるという回答もあります。たとえば、ContentControl
メインの UserControl (UC_Host と呼びましょう) で a を宣言できます。これにより、ViewModel のタイプに応じてビューが選択され、ContentControl
生成した ViewModel に DataContext がバインドされます。私の理解では、たとえば、私の UC_Host が常に存在し、UC をホストするために 1 つの UC_Host しか使用できない場合などは、実現可能です。
しかし、私たちのプロジェクトでは、実際には生成された UC を new で表示したいと考えてWindow
おり、これらの数はWindow
制限されていません (MDI は WPF にはまだ存在せず、マルチウィンドウ レイアウトがいくつかのタスクに対する現在のソリューションです)。つまり、支配的な一意の UC_Host が新しいものの上にWindows
ないため、そこから ViewModel にバインドするのも簡単ではありません。
そのため、MainView でビューを解決できるようにするソリューションを探しています (UI スレッドでのみ UIElement を生成し、Window
おそらくコード ビハインドで新しいものを生成できるため)。直接データバインディングは不可能だと思います