本文主要记录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的用法,下一小节将在此基础上增加左键单击,左键双击,右键单击及选中的交互用法。

WPF之DataTemplateSelector的运用的更多相关文章

  1. WPF:DataTemplateSelector设置控件不同的样式

    原文 WPF:DataTemplateSelector设置控件不同的样式 最近想实现这么个东西,一个ListBox, 里面的ListBoxItem可能是文本框.下拉框.日期选择控件等等. 很自然的想到 ...

  2. WPF中DataTemplateSelector的简单应用

    WPF中DataTemplateSelector的简单应用 DataTemplateSelector中文叫数据模板选择器,根据数据模型内的属性值选择不同的数据模板,多用于容器如listbox中,达到同 ...

  3. WPF之DataTemplateSelector技巧

    WPF中如何通过一个属性来控制对象的模板,属性值改变时对象的模板会跟随改变? 两个关键点   1 属性/对象更改通知 方法一:继承INotifyPropertyChanged接口,当属性值更改时需要让 ...

  4. wpf 模板选择器DataTemplateSelector及动态绑定使用教程

    其实也说不上算是教程了,只是把自己学习的代码拿出来分享一下,同时方便以后遇到类似问题的时候翻一下.MSDN里如是说:通常,如果有多个 DataTemplate 可用于同一类型的对象,并且您希望根据每个 ...

  5. 【转】wpf 模板选择器DataTemplateSelector及动态绑定,DataTemplate.Triggers触发器的使用

    通常,如果有多个 DataTemplate 可用于同一类型的对象,并且您希望根据每个数据对象的属性提供自己的逻辑来选择要应用的 DataTemplate,则应创建 DataTemplateSelect ...

  6. wpf 模板选择器DataTemplateSelector及动态绑定,DataTemplate.Triggers触发器的使用

    通常,如果有多个 DataTemplate 可用于同一类型的对象,并且您希望根据每个数据对象的属性提供自己的逻辑来选择要应用的 DataTemplate,则应创建 DataTemplateSelect ...

  7. WPF 中关于 DataTemplateSelector 类的应用

    MSDN的解释: 提供一种根据数据对象和与该数据绑定的元素来选择数据模板 DataTemplate 的方法. 示例代码: <Window x:Class="WpfApplication ...

  8. WPF DataTemplateSelector的使用

    <Window x:Class="CollectionBinding.MainWindow"        xmlns="http://schemas.micros ...

  9. WPF/UWP 模板选择器 DataTemplateSelector

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. 第三章 学习Shader所需的数学基础(5)

    1. Unity Shader的内置变量(数学篇) 使用Unity写shader的一个好处在于,它提供了很多内置参数,这使得我们不在需要自己手动算一些值.本文给出Unity内置的用于空间变换和摄像机以 ...

  2. react-native技术调研:react-native是什么?

    如有疏漏错误,还望指正.转载不忘加上>>原链接<<哦~ react-native是什么? react-native原理 从字面意思上来看,react-native由单词reac ...

  3. Python爬虫从入门到精通——基本库re的使用:正则表达式【华为云技术分享】

    置顶:华为云618大促火热进行中,全场1折起,免费抽主机,消费满额送P30 Pro,点此抢购. 正则表达式是处理字符串的强大工具,它有自己特定的语法结构,有了它,实现字符串的检索.替换.匹配验证都不在 ...

  4. redis--linux环境搭建

    1.redis诞生的背景 在这要从08年开始说起,一个意大利的小伙子创建一个访问网站信息的LLOOGG.COM网站,用来记录网站的访问记录,查看最近一万条访问信息,每次访问都会将数据存入mysql当中 ...

  5. 揭秘 iOS App Extension 开发 —— Today 篇

    转自:http://www.cocoachina.com/ios/20160619/16760.html 本文授权转载,作者:Cyandev(简书) 从 iOS 8 开始,苹果引入了全新的 App E ...

  6. git配置文件—— .gitattributes

    目录 .gitattributes 文档 1. gitattributes文件以行为单位设置一个路径下所有文件的属性,格式如下: 2. 在gitattributes文件的一行中,一个属性(以text属 ...

  7. python pyHook安装

    Hook安装 哇 这东西可真费劲  主要有pyhook和pyhook3 两种 每个都要根据系统版本和python版本 分成各种小版本 具体安装 一.可以在cmd 中输入 pip install pyh ...

  8. WebAPI接口的自动化测试2

    接口认证: 服务器的接口需要通过一个验证机制,这个验证机制可以是session或token 以session为例. session存储与服务器,通常用户登录后,服务器会把配套的sessionid发送给 ...

  9. 【JS】374- 重学 this 关键字

    为什么要学习this关键字 1. 面试会问啊!总有一些面试官喜欢问你一段不可能这么写的代码.看一道经典且古老的面试题(学完本文后,文末会有一道更复杂的面试题等着你哦!) 代码如下: let a = 5 ...

  10. 【Vuejs】301- Vue 3.0前的 TypeScript 最佳入门实践

    前言 我个人对更严格类型限制没有积极的看法,毕竟各类转类型的骚写法写习惯了. 然鹅最近的一个项目中,是 TypeScript+ Vue,毛计喇,学之...-真香! 1. 使用官方脚手架构建 npm i ...