动态更改数据模板

20

我有一个项目控件,它与任务相关联。每个任务都有任务状态。我为每个任务状态定义了不同的数据模板,还有数据模板选择器。

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

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

如果这样做行不通,我将探索其他替代方案,例如:
1. 附加到任务状态的属性。任何更改都将动态设置数据模板。
2. 可视状态管理器


也许这个答案也适用于你:https://dev59.com/zmoy5IYBdhLWcg3wL7L1 - michele
已经查看了这个答案。它可能有效,但看起来有点复杂。正在寻找更简单的解决方案。 - Tilak
2个回答

55

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

我使用的替代方法是基于属性更改来改变 TemplateDataTriggers

例如,这将使用 ContentControl 绘制所有的 TaskModel 对象,并且 ContentControl.Template 基于 TaskModelTaskStatus 属性进行更改。

<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成员。我有什么遗漏吗? - Jake Gaston
@JakeGaston 你在使用Silverlight吗?我认为只有设置了TargetType的隐式DataTemplates在Silverlight 4.5之后才被实现。 - Rachel

8

如果您像我一样觉得这篇文章非常有帮助,这里有一个小技巧 -

目前在WPF中,看起来您需要在DataTemplate定义中使用< strong >DataType< /strong >而不是< strong >TargetType< /strong >:

<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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接