23

私はと呼ばれるビューモデルを持っています

 ViewModelClass 

ブール値が含まれています。

を含む別のビューモデルがあります

ObservableCollection<ViewModelClass> m_allProjects;

それから私はこれを私の見解に持っています:

<DataTemplate>
   <views:ProjectInfoView x:Key="ProjectInfoDetailTemplate"/>
</DataTemplate>

<ItemsControl Grid.Row="1" Grid.Column="0"
              ItemsSource="{Binding AllProjects}"
              ItemTemplate="{StaticResource ProjectInfoDetailTemplate}"
              Margin="10,28.977,10,10">
</ItemsControl >

AllProjects コレクションのブール値に基づいて、別のデータ テンプレートを使用したいと考えています。これを行う最善の方法は何ですか?

さまざまな ViewModel でこれを実行し、一種の ViewModel ベース オブジェクトを使用できることはわかっていますが、私は 1 つのビュー モデルのみを使用することを好みます。

編集:

データトリガーでこれを行いたいです。誰かが私にいくつかのコードを提供してもらえますか?

4

1 に答える 1

79

私は通常、を使用しContentControlてデータを表示し、ContentTemplate変更されたプロパティに基づいてトリガーでを交換します。

これは、バインドされたプロパティに基づいてテンプレートを交換するブログに投稿した例です。

<DataTemplate x:Key="PersonTemplate" DataType="{x:Type local:ConsumerViewModel}">
     <TextBlock Text="I'm a Person" />
</DataTemplate> 

<DataTemplate x:Key="BusinessTemplate" DataType="{x:Type local:ConsumerViewModel}">
     <TextBlock Text="I'm a Business" />
 </DataTemplate>

<DataTemplate DataType="{x:Type local:ConsumerViewModel}">
     <ContentControl Content="{Binding }">
         <ContentControl.Style>
             <Style TargetType="{x:Type ContentControl}">
                 <Setter Property="ContentTemplate" Value="{StaticResource PersonTemplate}" />
                 <Style.Triggers>
                     <DataTrigger Binding="{Binding ConsumerType}" Value="Business">
                         <Setter Property="ContentTemplate" Value="{StaticResource BusinessTemplate}" />
                     </DataTrigger>
                 </Style.Triggers>
             </Style>
         </ContentControl.Style>
     </ContentControl>
 </DataTemplate>

ADataTemplateSelectorも機能しますが、DataTemplateSelectors変更通知に応答しないため、表示するテンプレートを決定するプロパティが変更されない場合に限ります。何が起こっているかを確認できるように、ビュー内のビュー選択ロジックも優先するため、通常は可能な限りそれらを避けます。

于 2012-04-17T12:58:58.400 に答える