WPF:数据绑定--数据模板介绍

DataTemplatingIntro数据模板介绍

实现效果:ide

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

clipboard.png

clipboard.png

实践:布局

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

重要代码:
ImportantTaskTemplate的模板以下:spa

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

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

界面xamlorm

<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 属性:ip

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