我有一个名为

 ViewModelClass
其中包含一个 bool(boolean) 值。
我有另一个 View 模型,其中包含
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集合中的 bool(boolean) 值,使用其他数据模板。做这个的最好方式是什么?
我知道我可以使用不同的ViewModels来执行此操作,并使用一种基于ViewModel的对象,但是我更喜欢仅使用1个 View 模型。
编辑:
我想用数据触发器来做到这一点。有人可以给我一些代码吗?

最佳答案

我通常使用ContentControl显示数据,并根据更改的属性在触发器中换出ContentTemplate

这是我在my blog上发布的一个示例,该示例根据绑定(bind)属性交换模板

<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不响应更改通知,因此决定显示哪个模板的属性没有更改。我通常尽可能避免使用它们,因为我也更喜欢 View 选择逻辑,以便了解发生了什么。

关于wpf - 基于成员变量的不同 View /数据模板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10190887/

10-09 08:09
查看更多