我有一个项目控件,它与任务相关联。每个任务都有任务状态。我为每个任务状态定义了不同的数据模板,还有数据模板选择器。
问题是当任务状态动态更改时,我无法弄清如何触发数据模板选择器。
我想知道如何将数据触发器与数据模板一起使用。
如果这样做行不通,我将探索其他替代方案,例如:
1. 附加到任务状态的属性。任何更改都将动态设置数据模板。
2. 可视状态管理器
我有一个项目控件,它与任务相关联。每个任务都有任务状态。我为每个任务状态定义了不同的数据模板,还有数据模板选择器。
问题是当任务状态动态更改时,我无法弄清如何触发数据模板选择器。
我想知道如何将数据触发器与数据模板一起使用。
如果这样做行不通,我将探索其他替代方案,例如:
1. 附加到任务状态的属性。任何更改都将动态设置数据模板。
2. 可视状态管理器
DataTemplateSelector
不会响应 PropertyChange
通知,因此当您的属性更改时不会重新评估它。
我使用的替代方法是基于属性更改来改变 Template
的 DataTriggers
。
例如,这将使用 ContentControl
绘制所有的 TaskModel
对象,并且 ContentControl.Template
基于 TaskModel
的 TaskStatus
属性进行更改。
<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>
如果您像我一样觉得这篇文章非常有帮助,这里有一个小技巧 -
目前在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>