一、场景模拟

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

我们需要在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. Solon 1.5.16 发布,多项细节优化

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  2. Leetcode:面试题 04.04. 检查平衡性

    Leetcode:面试题 04.04. 检查平衡性 Leetcode:面试题 04.04. 检查平衡性 Talk is cheap . Show me the code . /** * Definit ...

  3. 【游记】OI 2020-2021(在更)

    [CSP-S2020初赛] [CSP-S2020] [NOIp 2020] [NOI冬令营 2021] [省选 2021] [NOI 2021]

  4. Dijkstra和堆优化

    Dijkstra算法 由于我之前一直记的迪杰斯特拉的翻译导致我把dijkstra写成了dijstra--所以下文#define dijstra dijkstra 我以后叫她迪杰克斯歘! Dijskra ...

  5. WEB安全新玩法 [9] 重置密码之验证流程防绕过

    一般来说,业务流程中出现多个操作环节时,是需要顺序完成的.程序设计者往往按照正常用户的操作顺序实现功能,而忽略了攻击者能够绕过中途环节,直接在后续环节上进行非法操作.iFlow 业务安全加固平台能够在 ...

  6. [考试总结]noip模拟26

    首先看到这样中二的题目心头一震.... 然而发现又是没有部分分数的一天. 然而正解不会打.... 那还是得要打暴力. 但是这套题目有两个题目只有一个参数. 所以... (滑稽).jpg 然后我就成功用 ...

  7. 【阿菜用工具】利用 Web3.js 在 ganache 上部署以及调用智能合约

    合约部署 要部署的合约 pragma solidity ^0.4.23; contract test { uint256 value; function setValue(uint256 _value ...

  8. Bugku-web-字符?正则?

    题目意思很明显,根据给出的规则构造出合理的正则表达式然后通过get方式提交弹出Flag. i:字体大小 /..../表示开始和结束. .号表示匹配0-9任一数字 *号表示重复前一个字符多次 {4,7} ...

  9. 原生js 以ajax(post)的方式传json至php,并让php解析为数组

    如题. 比如要把一个json,如 json= {name:"John Rambo", time:"3pm"},,通过js ,传到一个php服务器 fwq.php ...

  10. SaToken学习笔记-01

    SaToken学习笔记-01 SaToken版本为1.18 如果有排版方面的错误,请查看:传送门 springboot集成 根据官网步骤maven导入依赖 <dependency> < ...