DataTemplatingIntro数据模板介绍

实现效果:

  1. 列出任务项数据,由普通数据模板显示一般信息,重要任务项则只显示大写文本描述。
  2. 若任务项的类型为Home,由数据模板的边框改变成黄色,其他任务只大写显示文本
  3. 根据选定的任务项由数据模板展示其详细信息

clipboard.png

clipboard.png

实践:

  1. DataTemplate.Triggers数据模板触发器
  2. ItemTemplateSelector数据模板选择器使用
  3. IsSynchronizedWithCurrentItem同步当前项

重要代码:
ImportantTaskTemplate的模板如下:

<DataTemplate x:Key="ImportantTaskTemplate">
    <DataTemplate.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="FontSize" Value="20"/>
        </Style>
    </DataTemplate.Resources>
    <Border Name="border" BorderBrush="Red" BorderThickness="1"
      Padding="5" Margin="5">
        <DockPanel HorizontalAlignment="Center">
            <TextBlock Text="{Binding Path=Description}" />
            <TextBlock>!</TextBlock>
        </DockPanel>
    </Border>
</DataTemplate>

数据模板触发器xaml代码
DataTrigger-Binding-Value--Setter

<DataTemplate.Triggers>
    <DataTrigger Binding="{Binding Path=TaskType}">
        <DataTrigger.Value>
            <local:TaskType>Home</local:TaskType>
        </DataTrigger.Value>
        <Setter TargetName="border" Property="BorderBrush" Value="Yellow"/>
    </DataTrigger>
</DataTemplate.Triggers>

界面xaml

<StackPanel>
    <TextBlock FontSize="20" Text="My Task List:"/>
    <ListBox Width="400" Margin="10"
         ItemsSource="{Binding Source={StaticResource MyTodoList}}"
         ItemTemplateSelector="{StaticResource MyDataTemplateSelector}"
         HorizontalContentAlignment="Stretch" 
         IsSynchronizedWithCurrentItem="True"/>
    <TextBlock FontSize="20" Text="Information:"/>
    <ContentControl Content="{Binding Source={StaticResource MyTodoList}}"
                ContentTemplate="{StaticResource MyTaskTemplate}"/>
</StackPanel>

选择器继承DataTemplateSelector类
业务逻辑:如果任务重要性等于1,则加载指定重要模板资源,否则加载一般资源

public class TaskListDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate
        SelectTemplate(object item, DependencyObject container)
    {
        if (item != null && item is Task)
        {
            var taskitem = (Task) item;
            var window = Application.Current.MainWindow;
            if (taskitem.Priority == 1)
                return
                    window.FindResource("ImportantTaskTemplate") as DataTemplate;
            return
                window.FindResource("MyTaskTemplate") as DataTemplate;
        }

        return null;
    }
}

扩展:
DataTemplateSelector 类:

  1. 若要创建模板选择器,请创建继承自 DataTemplateSelector 的类并重写 SelectTemplate 方法。 在定义您的类后,就可以将类的实例分配到您的元素的模板选择器属性。
  2. 请注意,如果具有不同类型的对象,则可以对 DataTemplate 设置 DataType 属性。 如果您执行了此操作,则无需创建 DataTemplateSelector。
  3. 此外,如果对象类型相同但属性不同,也可以考虑使用 DataTrigger 或数据转换器。

ItemsControl.ItemTemplateSelector 属性:

  1. 使用 ItemContainerStyle 属性或 ItemContainerStyleSelector 属性来设置样式,以影响包含数据项的元素的外观。 例如,对于 ListBox,生成的容器是 ListBoxItem 控件;对于 ComboBox,它们是 ComboBoxItem 控件。
  2. 若要影响项的布局,请使用 ItemsPanel 属性。 如果在控件上使用分组,可以使用 GroupStyle 或 GroupStyleSelector 属性。

李志玮
22 声望34 粉丝

求索~~


引用和评论

0 条评论