我为啥称之为“动态数据模板”?先看看下面的截图,今天,我们就是要实现这种功能。

大概是这样的,我们定义的DataTemplate是通过触发器动态应用到 ComboBoxItem 上。

这个下拉列表控件绑定了一个Person集合,Person类的定义如下:
  1. public class Person
  2. {
  3. public string Name { get; set; }
  4. public int Age { get; set; }
  5. public string Email { get; set; }
  6. public override string ToString()
  7. {
  8. return Name;
  9. }
  10. }
这里重写了ToString方法,因为ComboBox生成的项是调用对象的ToString方法的,为了能不设置数据模板的前提下正确显示列表项,需要重写ToString方法,默认显示姓名属性。
 
然后,我们为ComboBoxItem定义一个处于高亮状态时使用的数据模板,也就是当鼠标移到项上时发生。
  1. <Window.Resources>
  2. <!--
  3. 当项高亮显示时使用的数据模板
  4. -->
  5. <DataTemplate x:Key="hightlightTmp">
  6. <Grid>
  7. <Grid.RowDefinitions>
  8. <RowDefinition Height="auto"/>
  9. <RowDefinition Height="auto"/>
  10. </Grid.RowDefinitions>
  11. <StackPanel Margin="0,5,0,0" Grid.Row="0" Orientation="Horizontal">
  12. <TextBlock Margin="2,0" FontWeight="Bold" FontSize="14">
  13. <TextBlock.Text>
  14. <Binding Path="Name"
  15. StringFormat="姓名:{0}"/>
  16. </TextBlock.Text>
  17. </TextBlock>
  18. <TextBlock Margin="20,0">
  19. <TextBlock.Text>
  20. <Binding Path="Age"
  21. StringFormat="年龄:{0}"/>
  22. </TextBlock.Text>
  23. </TextBlock>
  24. </StackPanel>
  25. <TextBlock Margin="0,2,0,5" Grid.Row="1">
  26. <TextBlock.Text>
  27. <Binding Path="Email"
  28. StringFormat="电邮:{0}"/>
  29. </TextBlock.Text>
  30. </TextBlock>
  31. </Grid>
  32. </DataTemplate>
  33. ..............
  34. </Window.Resources>
为 ComboBoxItem 定义一个样式。
  1. <Window.Resources>
  2. ................
  3. <!-- 项样式 -->
  4. <Style x:Key="cmbStyle" TargetType="{x:Type ComboBoxItem}">
  5. <Style.Triggers>
  6. <Trigger Property="IsHighlighted" Value="True">
  7. <Setter Property="ContentTemplate"
  8. Value="{StaticResource hightlightTmp}"/>
  9. </Trigger>
  10. </Style.Triggers>
  11. </Style>
  12. </Window.Resources>
在窗体中声明一个ComboBox。
  1. <Grid>
  2. <ComboBox x:Name="cmb" Margin="10,10"
  3. Height="24" Width="200"
  4. HorizontalAlignment="Left"
  5. VerticalAlignment="Top"
  6. ItemContainerStyle="{StaticResource cmbStyle}"/>
  7. </Grid>
最后,切换到代码视图,完成设置数据源的C#代码。
  1. public Window1()
  2. {
  3. InitializeComponent();
  4. this.cmb.ItemsSource = new Person[]
  5. {
  6. new Person{Name="小李",Age=22,Email="suk211@163.com"},
  7. new Person{Name="小王",Age=20,Email="minat@126.com"},
  8. new Person{Name="黄涨",Age=21,Email="laned2@21cn.com"},
  9. new Person{Name="高产",Age=22,Email="ha@136.com"},
  10. new Person{Name="杜林",Age=21,Email="null@yaahoo.com"},
  11. new Person{Name="杨白姥",Age=50,Email="cYang@21cn.com"},
  12. new Person{Name="鸟人",Age=31,Email="bgl@ask.net.cn"},
  13. new Person{Name="宋小八",Age=28,Email="xde227@123h.com"}
  14. };
  15. }
完成,这时候运行一下,你会看到上文中截图中的效果了。
 
 

继续聊WPF——动态数据模板的更多相关文章

  1. WPF 动态更换模板

    Window x:Class="模板选择器.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml ...

  2. WPF 寻找数据模板中的元素

    <Window x:Class="Wpf180706.Window11"        xmlns="http://schemas.microsoft.com/wi ...

  3. 转载 WPF -- 控件模板 (ControlTemplate)(一) https://blog.csdn.net/qq_23018459/article/details/79899838

    ControlTemplate(控件模板)   https://blog.csdn.net/qq_23018459/article/details/79899838 WPF包含数据模板和控件模板,其中 ...

  4. [WPF系列]-数据邦定之DataTemplate 根据对象属性切换模板

      引言 书接上回[WPF系列-数据邦定之DataTemplate],本篇介绍如何根据属性切换模板(DataTemplate)   切换模板的两种方式:   使用DataTemplateSelecto ...

  5. WPF中的数据模板使用方式之一:ContentControl、ContentTemplate和TemplateSelector的使用

    在WPF中,数据模板是非常强大的工具,他是一块定义如何显示绑定的对象的XAML标记.有两种类型的控件支持数据模板:(1)内容控件通过ContentTemplate属性支持数据模板:(2)列表控件通过I ...

  6. WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)对象绑定

    原文:WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)对象绑定 WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件) 上面的 ...

  7. WPF 后台获得 数据模板里的内容控件(DataTemplate)

    原文:WPF 后台获得 数据模板里的内容控件(DataTemplate) 假如      <Window.Resources> 里 有一个 Datatemplate 我想获得TextBlo ...

  8. WPF的ComboBox 数据模板自定义

    WPF的ComboBox 有些时候不能满足用户需求,需要对数据内容和样式进行自定义,下面就简要介绍一下用数据模板(DataTemplate)的方式对ComboBox 内容进行定制: 原型设计如下: 步 ...

  9. WPF中的数据模板(DataTemplate)(转)

    原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/30/694388.html WPF中的数据模板(DataTemplate)        ...

随机推荐

  1. 面试题:判断两个字符串是否互为回环变位(Circular Rotaion)

    题干:   如果字符串 s 中的字符循环移动任意位置之后能够得到另一个字符串 t,那么 s 就被称为 t 的回环变位(circular rotation).   例如,ACTGACG 就是 TGACG ...

  2. win7系统下ping不是内部或外部命令

    win7下ping不是内部或外部命令,在使用java设置变量环境时,可能会遇到这样的问题,出现win7下ping不是内部或外部命令,是在设置变量环境是把一些设置删掉了的原因,请看在win7下怎么还原. ...

  3. Scala快学笔记(一)

    一,基本概念: 1,Scala是一种基于JVM的面向对象和函数式编程语言 2,基本类型:数值类型 ->:Byte,Short,Int,Long,Float,Double和布尔类型:Boolean ...

  4. angularJS 中的two-way data binding.

    原文: https://stackoverflow.com/questions/11616636/how-to-do-two-way-filtering-in-angularjs ---------- ...

  5. JAVA加解密 -- 对称加密算法与非对称加密算法

    对称加密算法:双方必须约定好算法 DES 数据加密标准:由于不断地被破解 自98年起就已经逐渐放弃使用 AES 目前使用最多的加密方式,官方并未公布加密方式已被破解,替代DES 实现和DES非常接近 ...

  6. Node.js nvshens图片批量下载爬虫 1.00

    //====================================================== // www.nvshens.com图片批量下载Node.js爬虫1.00 // 此程 ...

  7. 解决ie下载apk后更改后缀名为.zip的问题

    转自:http://www.cnblogs.com/niuniu/archive/2012/03/06/2381811.html 解决: 服务器添加MIME类型: application/vnd.an ...

  8. driver: Linux设备模型之input子系统具体解释

    本节从总体上解说了输入子系统的框架结构.有助于读者从总体上认识linux的输入子系统.在陷入代码分析的过程中,通过本节的知识可以找准方向,明确原理. 本节重点: 输入子系统的框架结构 各层相应内核中的 ...

  9. .net错误处理机制

    原地址:http://blog.csdn.net/lxbg90058/article/details/5651767 没有不出错的软件 从不出错的软件从某种程度上讲是不可能的! 和普通人的观念相反,创 ...

  10. Django——META内部类选项

    Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.以下对此作一总结: abstract      这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会对应 ...