本文主要记录WPF中DataTemplateSelector的运用,数据模板选择器主要运用在一些项容器中用于根据不同的数据类型选择不同的DataTemplate,以便展示不同的数据。在此以在listbox显示字符串和一个颜色块来说明DataTemplateSelector的运用。

DataTemplateSelector运用的核心是需继承DataTemplateSelector类并重写其DataTemplateSelector方法,在UI上实现不同类型的DataTemplate,并将这不同的DataTemplate赋值给listbox的ItemTemlateSelector。

在一个listbox中显示文本还有颜色块,显示文本和颜色是两种不同的数据类型,实际项目中可以根据需要用不同的class类型设置不同的样式和模板,效果图如下:

以下为代码:

 public class DataModel1
{
public string Name { get; set; }
public DataModel1(string name)
{
Name = name;
}
} public class DataModel2
{
public Brush Color { get; set; }
public DataModel2(Brush color)
{
Color = color;
}
} public class DataModel
{
public Object Ob { get; set; }
public string TypeName { get; set; }
} public class ListBoxDataTemplateSelector : DataTemplateSelector
{
public DataTemplate Template1 { get; set; }
public DataTemplate Template2 { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
Type t = item.GetType();
string typeName = null;
PropertyInfo[] properties = t.GetProperties();
foreach (PropertyInfo pi in properties)
{
if (pi.Name == "TypeName")
{
typeName = pi.GetValue(item, null).ToString();
break;
}
}
switch (typeName)
{
case "txt":
return Template1;
case "color":
return Template2;
default:
return null; }
}
}

Xaml:

Window x:Class="ListBoxExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ListBoxExample"
mc:Ignorable="d" Name="MainWindow1"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ControlTemplate x:Key="Template1">
<TextBlock Text="{Binding Ob.Name}"/>
</ControlTemplate>
<ControlTemplate x:Key="Template2">
<Border Height="30" Width="90" Background="{Binding Ob.Color}"></Border>
</ControlTemplate>
<local:ListBoxDataTemplateSelector x:Key="ListBoxDataTemplateSelector">
<local:ListBoxDataTemplateSelector.Template1>
<DataTemplate>
<ContentControl Template="{StaticResource Template1}"></ContentControl>
</DataTemplate>
</local:ListBoxDataTemplateSelector.Template1>
<local:ListBoxDataTemplateSelector.Template2>
<DataTemplate>
<ContentControl Template="{StaticResource Template2}"></ContentControl>
</DataTemplate>
</local:ListBoxDataTemplateSelector.Template2>
</local:ListBoxDataTemplateSelector>
</Window.Resources>
<Grid Name="grid0" Width="100" Height="200">
<ListBox Name="list0" ItemTemplateSelector="{StaticResource ListBoxDataTemplateSelector}" ItemsSource="{Binding Datas}" > </ListBox>
</Grid>
</Window>

数据的初始化和绑定:

 /// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var vm = new Vm();
this.DataContext = vm; }
} public class Vm
{
private ObservableCollection<DataModel> _Datas = new ObservableCollection<DataModel>();
public ObservableCollection<DataModel> Datas
{
get { return _Datas; }
set { _Datas = value; }
} public Vm()
{
DataModel a1 = new DataModel { Ob = new DataModel1("This is name1"), TypeName = "txt" };
DataModel a2 = new DataModel { Ob = new DataModel2(Brushes.Red), TypeName = "color" };
DataModel a3 = new DataModel { Ob = new DataModel2(Brushes.Green), TypeName = "color" };
DataModel a4 = new DataModel { Ob = new DataModel1("This is name2"), TypeName = "txt" };
DataModel a5 = new DataModel { Ob = new DataModel2(Brushes.GreenYellow), TypeName = "color" };
_Datas.Add(a1);
_Datas.Add(a2);
_Datas.Add(a3);
_Datas.Add(a4);
_Datas.Add(a5);
}
}

以上是DataTemplateSelector的用法,下一小节将在此基础上增加左键单击,左键双击,右键单击及选中的交互用法。

最新文章

  1. Android-RecyclerView
  2. 深入学习jQuery的三种常见动画效果
  3. [原] wmic: Invalid XSL format (or) file name错误解决方法
  4. Jpanel和container和jframe的区别
  5. laravel开发微信公众号1 之基本配置
  6. iOS 剪贴板基本知识
  7. 重新想象 Windows 8.1 Store Apps (84) - 图像处理的新特性, Share Contract 的新特性
  8. SQLite 解决:Could not load file or assembly &#39;System.Data.SQLite ... 试图加载格式不正确的程序/or one of its dependencies. 找不到指定的模块。
  9. POJ 1035 Spell checker 简单字符串匹配
  10. USB Type-C“三剑客”: 连接器、控制器和电缆
  11. Firebug入门指南(转)
  12. BZOJ 2809: [Apio2012]dispatching [斜堆]
  13. 从javascript发展说到vue
  14. 回顾曾经的自己,献给java初学者的建议
  15. 【推荐】HTML5 Word Cloud——中文词云
  16. QTP 自动化测试--点滴 等待
  17. .resx文件与.cs文件的自动匹配
  18. javascript 伪数组和转化为标准数组
  19. 使用Speech SDK 5.1文字转音频
  20. 获取的时候报cannot find package &quot;golang.org /x/net/context&quot;,编译也报错误

热门文章

  1. js人民币转大写
  2. mongoDB学习笔记(一)之操作符
  3. Git的安装和使用教程详解
  4. SX1276/SX1278和SXSX1262的详细参数对比
  5. go break的使用
  6. mac版 sublime快捷键大全
  7. 回文自动机pam
  8. HDU 2444 The Accomodation of Students (二分图存在的判定以及最大匹配数)
  9. 【重温基础】JS中的常用高阶函数介绍
  10. 一线互联网公司Redis使用精髓,你必须要掌握这4点!