【问题标题】:Change Data template dynamically动态更改数据模板
【发布时间】:2012-10-30 10:14:49
【问题描述】:

我有一个绑定到任务的项目控件。每个任务都有任务状态。我为每个任务状态定义了不同的数据模板,以及数据模板选择器。

问题是我无法弄清楚当任务状态动态更改时如何触发数据模板选择器。

我想知道如何将数据触发器与数据模板一起使用。

如果这不起作用,我将探索其他替代方案,例如
1. 附加属性绑定到任务状态。任何更改都会动态设置数据模板。
2. 视觉状态管理器

【问题讨论】:

标签: wpf triggers datatemplateselector datatemplate


【解决方案1】:

DataTemplateSelector 不会响应 PropertyChange 通知,因此当您的属性更改时不会重新评估它。

我使用的替代方法是DataTriggers,它根据属性更改Template

例如,这将使用ContentControl 绘制所有TaskModel 对象,而ContentControl.Template 基于TaskStatusTaskStatus 属性TaskModel

<DataTemplate x:Key="OpenTaskTemplate" TargetType="{x:Type local:TaskModel}">
     <TextBlock Text="I'm an Open Task" />
</DataTemplate> 

<DataTemplate x:Key="ClosedTaskTemplate" TargetType="{x:Type local:TaskModel}">
     <TextBlock Text="I'm a Closed Task" />
 </DataTemplate>

<DataTemplate DataType="{x:Type local:TaskModel}">
     <ContentControl Content="{Binding }">
         <ContentControl.Style>
             <Style TargetType="{x:Type ContentControl}">

                 <!-- Default Template -->
                 <Setter Property="ContentTemplate" Value="{StaticResource OpenTaskTemplate}" />

                 <!-- Triggers to change Template -->
                 <Style.Triggers>
                     <DataTrigger Binding="{Binding TaskStatus}" Value="Closed">
                         <Setter Property="ContentTemplate" Value="{StaticResource ClosedTaskTemplate}" />
                     </DataTrigger>
                 </Style.Triggers>
             </Style>
         </ContentControl.Style>
     </ContentControl>
 </DataTemplate>

【讨论】:

  • 嗯,DataTemplate 似乎没有 targetType 成员。我错过了什么吗?
  • @JakeGaston 您在使用 Silverlight 吗?我不认为隐式 DataTemplates(只设置了 TargetType 的那些)在 Silverlight 中实现,直到 4.5。
【解决方案2】:

对于像我一样发现这非常有用的任何人的简短说明 -

目前使用 WPF,您似乎希望在 DataTemplate 定义中使用 DataType 而不是 TargetType

<DataTemplate x:Key="OpenTaskTemplate" DataType="{x:Type local:TaskModel}">
     <TextBlock Text="I'm an Open Task" />
</DataTemplate> 

<DataTemplate x:Key="ClosedTaskTemplate" DataType="{x:Type local:TaskModel}">
     <TextBlock Text="I'm a Closed Task" />
 </DataTemplate>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多