6

MVVM パターンに従って WPF アプリケーションを設計しています。1つUserControlに(実際、この状況は何度も発生します)、たとえば を含む非常に複雑であるため、TabControlそれらをいくつかのサブに分割したいと思いUserControlます。たとえば、「メイン」ビューでは、それを MainUC と呼びましょTabControlTabItem。どちらもTabItem実際には多くの UI 要素を含むUserControlため、SubUCA と SubUCB の 2 つを設計します。つまり、MainUC の XAML は次のようになります。

<TabControl Name="mainUC" Grid.Row="0" >   
    <TabItem Header="Sub UC A" Name="SubUC1">
        <local:SubUCA />
    </TabItem>
    <TabItem Header="Sub UC B" Name="SubUC2">
        <local:SubUCB />
    </TabItem>
</TabControl > 

しかし、私の質問は次のとおりです。これらのViewModelをどのように配置すればよいUserControlですか? 私が現在使用している 1 つの方法は、ViewModel クラス (MainUC_VM と呼ばれる) を 1 つだけ持つことであり、DataContextMainUC の はこのクラス インスタンスに設定されます (依存性注入を使用していないことに注意してください。コード ビハインドでインスタンスを作成するだけです)。 MainUC の)。しかし、この方法では MainUC_VM クラスは MainUC と同じように非常に複雑になります。そのため、ViewModel もいくつかのクラスに分割したいと思います。たとえば、MainUC_VM クラスでは、このようなプロパティを持つことができます

public SubUCA_VM SubVM1 { get; set; }
public SubUCB_VM SubVM2 { get; set; }

ただし、依存性注入を使用していないため (私たちのチームは使用することを決定していないため)、DataContextSubVM1 と SubVM2 をそれぞれ SubUC1 と SubUC2にする方法を教えてください。SubUCA と SubUCB のコード ビハインドでインスタンス化することはできません。これらは MainUC_VM のプロパティ メンバーとは異なるためです。

私が考えることができるいくつかの方法は、1) SubUCA_VM および SubUCB_VM クラスをシングルトンにする (これは、デフォルトで MEF などを使用する依存性注入と同じ動作に似ています)、または 2)EvengAggregatorオブジェクトのインスタンス化を通知するために使用します。しかし、私の意見では、どちらの方法でも不必要な複雑さが追加されているようです。MVVM を使用するには、依存性注入がほとんど必須であるということですか? DIを使わずにそれを達成する方法はありますか?

4

1 に答える 1

4

暗黙的なデータ テンプレートを使用して、データ (VM) をビューにリンクできます。まず、 で使用できるリソース ディクショナリでデータ テンプレートを定義しますMainUC。これは、ユーザー コントロール自体にある場合もあれば、アプリケーション リソースにある場合もあります。これらのデータ テンプレートは、特定のタイプのデータを表示する必要がある場合に使用するコントロールを WPF に指示します。

<UserControl.Resources>
    <DataTemplate TargetType="{x:Type local:SubUCA_VM}">
       <local:SubUCA />
    </DataTemplate>
    <DataTemplate TargetType="{x:Type local:SubUCB_VM}">
       <local:SubUCB />
    </DataTemplate>
</UserControl.Resources>

次に、タブのコンテンツを子 VM にバインドします。

<TabControl Name="mainUC" Grid.Row="0" >   
    <TabItem Header="Sub UC A" Content="{Binding SubVM1}" />
    <TabItem Header="Sub UC B" Content="{Binding SubVM2}" />
</TabControl>

または、メイン VM に子 VMのリストを含めることもできます。Titleタブ コントロールがヘッダーに使用できるように、各子 VM にはプロパティが必要です。このようにして、メイン VM は UI を動的に構築できます。上記で定義したデータ テンプレートが必要です。

<TabControl ItemsSource="{Binding Children}" DisplayMemberPath="Title" />
于 2013-10-21T10:19:18.040 に答える