一、场景模拟

假设我们现在有如下需求:

我们需要在ListBox中的每个Item中显示某个成员的姓名、年龄以及喜欢的颜色,点击Item的时候,会在右边显示详细信息,同时也想让ListBox的样式变得好看一些,比如带有绿色边框等。

为了实现以上需求,我们可以使用控件模板来修改ListBox的默认样式,使之变得生动有趣,使用数据模板来改变ListBoxItem的数据呈现形式。

二、Demo

为了改变ListBoxItem的外观,我们在资源里定义一个名字为listBoxItemTemplate的数据模板,模板中使用Binding将数据进行关联,然后为ListBox的ItemTemplate属性进行赋值。

当我们点击左面ListBoxItem的时候,为了能在右面显示详细信息,我们定义四个Label,绑定左侧选中的ListBoxItem。

为了绑定方便,我们为四个Label加个父容器StackPanel,并将它的DataContext属性绑定到选中的ListBoxItem上(四个Label的DataContext就会继承StackPanel的DataContext属性)。

具体代码以及运行截图参见以下:

 1 using System.Collections.ObjectModel;
2 using System.Windows;
3
4 namespace DataTemplateDemo1
5 {
6 /// <summary>
7 /// Interaction logic for MainWindow.xaml
8 /// </summary>
9
10 public partial class MainWindow : Window
11 {
12 private ObservableCollection<Student> observableCollection = new ObservableCollection<Student>();
13 public ObservableCollection<Student> ObservableCollection
14 {
15 get { return observableCollection; }
16 set { observableCollection = value; }
17 }
18 public MainWindow()
19 {
20 InitializeComponent();
21 this.DataContext = this;
22 observableCollection.Add(new Student() {Name = "Tom", Age= 16, FavorColor="Red",Hobby="Swim" });
23 observableCollection.Add(new Student() { Name = "Maty", Age = 18, FavorColor = "Green" ,Hobby="Football"});
24 observableCollection.Add(new Student() { Name = "Alice", Age = 19, FavorColor = "Yellow" ,Hobby="Running"});
25 }
26 }
27
28 public class Student
29 {
30 public int Age { get; set; }
31 public string Name { get; set; }
32 public string FavorColor { get; set; }
33 public string Hobby { get; set; }
34 }
35
36 }
 1 <Window x:Class="DataTemplateDemo1.MainWindow"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 xmlns:local="clr-namespace:DataTemplateDemo1"
7 mc:Ignorable="d"
8 Title="DataTemplateDemo" Height="350" Width="525">
9 <Window.Resources>
10
11 <ControlTemplate x:Key="ListBoxControlTemplate" TargetType="ListBox">
12 <Grid>
13 <Border BorderBrush="Green" BorderThickness="1" CornerRadius="5" >
14 <Grid>
15 <ItemsPresenter TextBlock.Foreground="Green"></ItemsPresenter>
16 </Grid>
17 </Border>
18 </Grid>
19 </ControlTemplate>
20
21 <DataTemplate x:Key="listBoxItemTemplate">
22 <Grid Height="50">
23 <Grid.ColumnDefinitions>
24 <ColumnDefinition Width="150"/>
25 <ColumnDefinition Width="50"/>
26 </Grid.ColumnDefinitions>
27 <Grid.RowDefinitions>
28 <RowDefinition/>
29 <RowDefinition/>
30 </Grid.RowDefinitions>
31 <TextBlock Name="textbox1" Text="{Binding Name}" Grid.Row="0" Margin="5"/>
32 <TextBlock Name="textbox2" Text="{Binding Age}" Grid.Row="1" Margin="5"/>
33 <Rectangle Fill="{Binding FavorColor}" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Margin="3"></Rectangle>
34
35 </Grid>
36 </DataTemplate>
37 </Window.Resources>
38 <Grid>
39 <StackPanel Orientation="Horizontal">
40
41 <ListBox Margin="5" Name="stuList"
42 Template="{StaticResource ListBoxControlTemplate}"
43 ItemsSource="{Binding ObservableCollection}"
44 ItemTemplate="{StaticResource listBoxItemTemplate}">
45 </ListBox>
46 <StackPanel DataContext="{Binding Path=SelectedItem,ElementName=stuList}">
47 <Label Content="{Binding Name}"></Label>
48 <Label Content="{Binding Age}"></Label>
49 <Label Content="{Binding FavorColor}"></Label>
50 <Label Content="{Binding Hobby}"></Label>
51 </StackPanel>
52 </StackPanel>
53
54 </Grid>
55 </Window>

WPF---数据模板(一)的更多相关文章

  1. WPF数据模板和控件模板

     WPF中有控件模板和数据模板,控件模板可以让我们自定义控件的外观,而数据模板定义了数据的显示方式,也就是数据对象的可视结构,但是这里有一个问题需要考虑,数据是如何显示出来的?虽然数据模板定义了数 ...

  2. WPF数据模板样式选择器

    在使用数据模板样式选择器时,不能设置ItemContainerStyle的属性值,如果设置了该值,那么数据模板样式选择器会失去作用. 在使用数据模板样式选择器时,首先要创建数据模板样式选择器对象,此对 ...

  3. WPF数据模板(7)

    数据模板常用在3种类型的控件, 下图形式: 1.Grid这种列表表格中修改Cell的数据格式, CellTemplate可以修改单元格的展示数据的方式. 2.针对列表类型的控件, 例如树形控件,下拉列 ...

  4. WPF数据模板中绑定事件不触发问题

    今天比较闲,做一个练手的项目,结果在xaml中写了一个用户的数据模板后,在其中的某个Canvas上绑定了一个鼠标左击的事件,结果调试的时候,无论怎么点击都不跳到断点那里,百思不得其解. 之后尝试不绑定 ...

  5. WPF数据模板的数据触发器的使用

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

  6. WPF 数据模板使用值转换器

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

  7. WPF 数据模板DataType属性的使用,不用指定ItemTemplate

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

  8. WPF 数据模板的使用

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

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

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

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

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

随机推荐

  1. c语言:scanf(" %c",&bla); scanf("%c",&bla); 语句差别

    %前有空格,%没有空格 scanf("%c",&c) 与 scanf(" %c",&c),后者只是在%前多了个空格,似乎没有什么区别,但使用起来 ...

  2. 两人团队项目-石家庄地铁查询系统(web版)psp表

    结对开发_石家庄地铁查询_博客地址:https://www.cnblogs.com/Aduorisk/p/10652917.html 队友:冯利伟 PSP: PSP0 Personal Softwar ...

  3. 在 .NET 中创建对象的几种方式的对比

    在 .net 中,创建一个对象最简单的方法是直接使用 new (), 在实际的项目中,我们可能还会用到反射的方法来创建对象,如果你看过 Microsoft.Extensions.DependencyI ...

  4. vue(21)初识Vuex

    Vuex是做什么的? 官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式. 它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. Vuex ...

  5. Linux 安装 Nodejs 的两种方式

    Linux 安装 Nodejs 的两种方式 目录 Linux 安装 Nodejs 的两种方式 一.压缩包安装 Nodejs 二.源码编译安装 Nodejs 一.压缩包安装 Nodejs 下载 Node ...

  6. LCT(Link-Cut-Tree)

    LCT(Link-Cut-Tree) LCT维护一个森林,即把每个节点用splay维护,可以进行许多操作: 查询.修改链上的信息 随意指定原树的根(即换根) 动态连边.删边 合并两棵树.分离一棵树 动 ...

  7. ODOO里视图开发案例---定义一个像tree、form一样的视图

    odoo里视图模型MVC模式: 例子:在原来的视图上修改他: var CustomRenderer = KanbanRenderer.extend({ ....});var CustomRendere ...

  8. Java 异步编程的几种方式

    前言 异步编程是让程序并发运行的一种手段.它允许多个事情同时发生,当程序调用需要长时间运行的方法时,它不会阻塞当前的执行流程,程序可以继续运行,当方法执行完成时通知给主线程根据需要获取其执行结果或者失 ...

  9. 深度掌握 Java Stream 流操作,让你的代码高出一个逼格!

    概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream 的操作符大体上分为两种:中间操作符和终止操作符 中 ...

  10. ifix重用性模块化开发纪实(以污水处理泵站为例)

    在经过多个自动化上位机的开发后,对上位机的重用开发和提高效率,减少重复工作有了一定的积累.故而产生了模块化建设上位机的思路.现从当下项目开始,研究出一套可重复利用的模块化系统. 1.点表整理 从PLC ...