DataTemplatingIntro数据模板介绍
实现效果:
- 列出任务项数据,由普通数据模板显示一般信息,重要任务项则只显示大写文本描述。
- 若任务项的类型为Home,由数据模板的边框改变成黄色,其他任务只大写显示文本
- 根据选定的任务项由数据模板展示其详细信息
实践:
- DataTemplate.Triggers数据模板触发器
- ItemTemplateSelector数据模板选择器使用
- 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 类:
- 若要创建模板选择器,请创建继承自 DataTemplateSelector 的类并重写 SelectTemplate 方法。 在定义您的类后,就可以将类的实例分配到您的元素的模板选择器属性。
- 请注意,如果具有不同类型的对象,则可以对 DataTemplate 设置 DataType 属性。 如果您执行了此操作,则无需创建 DataTemplateSelector。
- 此外,如果对象类型相同但属性不同,也可以考虑使用 DataTrigger 或数据转换器。
ItemsControl.ItemTemplateSelector 属性:
- 使用 ItemContainerStyle 属性或 ItemContainerStyleSelector 属性来设置样式,以影响包含数据项的元素的外观。 例如,对于 ListBox,生成的容器是 ListBoxItem 控件;对于 ComboBox,它们是 ComboBoxItem 控件。
- 若要影响项的布局,请使用 ItemsPanel 属性。 如果在控件上使用分组,可以使用 GroupStyle 或 GroupStyleSelector 属性。