0

WPF で MVVM パターンを採用し始めており、これまでに ViewModel を View から分離し、Commandクラスを作成しました。ただし、すべての場合において、最初に View を初期化し、コード ビハインドで ViewModel を生成します。MVVM の利点を十分に探求していないと思います。たとえば、新しい UI コンポーネントを によって生成する必要がある場合、CommandCommandViewModel と 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おそらくコード ビハインドで新しいものを生成できるため)。直接データバインディングは不可能だと思います

4

3 に答える 3

1

View が最上位レベルにある MVVM に従う必要があるため、(コンストラクターであっても) ビューにコードを配置しないでください。ViewModel にロジックを実装し、View を作成してデータを適切に表示し、アプリケーションがそれらをバインドできるようにします。専用のメイン ウィンドウがないことは問題ではありません。DataTemplate を App.xaml にマージする限り、いつでも App.xaml またはその他のリソースに配置できます。別のウィンドウに UserControls を表示することは、それらを別のタブとして表示することとまったく同じです。

WPF 用の MDI が必要な場合は、http: //mdicontainer.codeplex.comを使用できます。

于 2013-11-20T13:09:19.360 に答える