web-dev-qa-db-ja.com

メンバー変数に基づくさまざまなビュー/データテンプレート

私はというビューモデルを持っています

 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つのビューモデルを使用することを好みます。

編集:

これをデータトリガーで実行したいと思います。誰かが私にいくつかのコードを提供できますか?

19
Josh Mulholland

私は通常、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>

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

69
Rachel