我们在将一个数据集合绑定到列表控件时,有时候想根据不同的数据类型,显示为不同的效果。
例如将一个文件夹集合绑定到ListBox时,系统文件夹显示为不同的效果,就可以使用模板选择器功能。
WPF提供了一个模板选择器类型DataTemplateSelector,它可以根据数据对象和数据绑定元素来选择 DataTemplate。
使用方法
创建一个类,继承自DataTemplateSelector,并重写SelectTemplate方法。
类似下面这样
1 using System.Windows; 2 using System.Windows.Controls; 3 4 namespace SDKSample 5 { 6 public class TaskListDataTemplateSelector : DataTemplateSelector 7 { 8 public override DataTemplate 9 SelectTemplate(object item, DependencyObject container) 10 { 11 FrameworkElement element = container as FrameworkElement; 12 13 if (element != null && item != null && item is Task) 14 { 15 Task taskitem = item as Task; 16 17 if (taskitem.Priority == 1) 18 return 19 element.FindResource("importantTaskTemplate") as DataTemplate; 20 else 21 return 22 element.FindResource("myTaskTemplate") as DataTemplate; 23 } 24 25 return null; 26 } 27 } 28 }
下面我们使用ListBox和TreeView进行演示
ListBox的使用示例
我们先定义如下的数据模型
1 public class FileData 2 { 3 public string FileName { get; set; } 4 } 5 6 public class FileData1 : FileData 7 { 8 public string FileData1Property { get; set; } 9 } 10 11 public class FileData2:FileData 12 { 13 public string FileData2Property { get; set; } 14 }
然后定义一个资源字典,分别在里面定义两种数据的数据模板
1 <DataTemplate x:Key="FileData1Datatemplate"> 2 <Grid> 3 <Grid.ColumnDefinitions> 4 <ColumnDefinition/> 5 <ColumnDefinition/> 6 </Grid.ColumnDefinitions> 7 <Label Content="{Binding FileName}" FontSize="20" Foreground="Green"></Label> 8 <Label Content="{Binding FileData1Property}" Grid.Column="1" VerticalAlignment="Center"></Label> 9 </Grid> 10 </DataTemplate> 11 12 <DataTemplate x:Key="FileData2Datatemplate"> 13 <Grid> 14 <Grid.ColumnDefinitions> 15 <ColumnDefinition/> 16 <ColumnDefinition/> 17 </Grid.ColumnDefinitions> 18 <Label Content="{Binding FileName}" FontSize="16" Foreground="Red"></Label> 19 <Label Content="{Binding FileData2Property}" Grid.Column="1" VerticalAlignment="Center"></Label> 20 </Grid> 21 </DataTemplate>
添加测试数据
1 List<FileData> fileDatas = new List<FileData>(); 2 FileData1 fileData1 = new FileData1(); 3 fileData1.FileName = "1.jpg"; 4 fileData1.FileData1Property = "1.jpg property"; 5 FileData2 fileData2 = new FileData2(); 6 fileData2.FileName = "2.jpg"; 7 fileData2.FileData2Property = "2.jpg property"; 8 fileDatas.Add(fileData1); 9 fileDatas.Add(fileData2); 10 this.listbox.ItemsSource = fileDatas;
然后再为ListBox设置DataTemplateSelector
1 this.listbox.ItemTemplateSelector = new ItemDataTemplateSelector();
运行效果如下: