WPF 之数据模板

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值