1. 数据模板有什么用?
首先要明白什么是模板,模板就是有些内容是固定的,有些内容是可以替换的一个结构。所谓数据模板就是把大部分属性都设置好,只要把数据填充进去,就可以正常显示了。那么数据模板有什么用呢?当然是控制数据如何显示了。
2.如何定义数据模板?
常用的方法是在资源中定义模板。例如:
<DataTemplate x:Key="readonlyCellTemplate">
<TextBlock Text="{Binding MessageType, Converter={StaticResource enumItemConverter}}"></TextBlock>
</DataTemplate>
这是一个非常简单的数据模板。有一个键:“readonlyCellTemplate”,可以通过这个键来引用此数据模板。一个TextBlock,这个TextBlock就是用来显示数据的。
3.定义好数据模板如何使用?
应如是用:
下面代码是DataGrid中的一个模板列,其中CellTemplate的值为readonlyCellTemplate
<DataGridTemplateColumn CellTemplate="{StaticResource readonlyCellTemplate}" Header="{Res HeaderType}">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ContentPresenter x:Name="Presenter" Content="{Binding}" ContentTemplate="{StaticResource readonlyCellTemplate}" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding DefinitionCategory,Converter={StaticResource definitionCategoryConverter}}" Value="True">
<Setter TargetName="Presenter" Property="ContentTemplate" Value="{StaticResource editableCellTemplate}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
DataType 属性:
DataTemplate 类具有 DataType 属性,该属性非常类似于 Style 类的 TargetType 属性。就是对所有指定的数据类型的数据应用模板。
4.如何动态选择数据模板?
有时候需要根据数据的属性值来动态选择数据模板,例如根据等级不同显示不同的样式结构。(触发器可以改变样式的值,但是无法改变样式的结构)。
首先,要在资源中定义不同的模板。
其次,实现一个类,继承DataTemplateSelector。override SelectTemplate方法。 例如;
public class TriggerDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate ( object item, DependencyObject container )
{
DataTemplate template = null;
if ( item != null && item is ConfigItemBase )
{
ConfigItemBase taskitem = item as ConfigItemBase;
FrameworkElement element = container as FrameworkElement;
template = element.FindResource ( "defaultTriggerTemplate" ) as DataTemplate;
}
return template;
}
}
然后,将新实现的类TriggerDataTemplateSelector声明为资源,例如:
<my:TriggerDataTemplateSelector x:Key="triggerDataTemplateSelector" />
最后,再将相关的TemplateSelector属性的值设置为资源中的triggerDataTemplateSelector
例如:
<DataGridTemplateColumn Width="50" Header="{Res ThresholdHeaderTrigger}" CellStyle="{StaticResource trigerStyle}" CellTemplateSelector="{StaticResource triggerDataTemplateSelector}" CellEditingTemplateSelector="{StaticResource defaultTriggerDataTemplateSelector}" >