【问题标题】:Different views / data template based on member variable基于成员变量的不同视图/数据模板
【发布时间】:2012-04-28 18:32:12
【问题描述】:

我有一个名为

的视图模型
 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 的对象来做到这一点,但我更喜欢只使用一个视图模型。

编辑:

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

【问题讨论】:

    标签: wpf xaml data-binding datatemplate


    【解决方案1】:

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

    这是我在my blog 上发布的一个示例,它基于绑定属性交换模板

    <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 不响应更改通知。如果可能的话,我通常会避免使用它们,因为我也更喜欢视图中的视图选择逻辑,这样我就可以看到发生了什么。

    【讨论】:

      猜你喜欢
      • 2017-10-18
      • 2016-12-03
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多