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-collection 中的布尔值使用不同的数据模板。做这个的最好方式是什么?

我知道我可以使用不同的 ViewModel 来做到这一点,并使用一种基于 ViewModel 的对象,但我更喜欢只使用一个视图模型。

编辑:

我想用数据触发器来做到这一点。有人可以给我一些代码吗?

4

1 回答 1

79

我通常使用 a来显示数据,并根据更改的属性在触发器中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 回答