WPF-数据模板
WPF设计数据模板(DataTemplete)是为了让数据也有外衣。
DataTemplete常应用在三个地方:
1、ContentControl(内容控件)的ContentTemplete属性,应用在内容控件的内容上;
2、ItemsControl(条目控件/也叫列表控件)的ItemTemplete属性,应用在列表控件的每一个项上;
3、GridViewColumn的cellTemplete属性,应用在GridViewColumn的单元格上。
如何创建一个DataTemplete?
1、WPF数据模板其实并不难,通常在写数据模板前,我们都会把数据模板的布局代码写在一个窗体中或者UserControl中;
2、观察预览界面感觉差不多之后,直接把布局部分的代码拷贝到DataTemplete标签中。
3、拷到DataTemplete标签里面后,只需再注意使用Binding,让每一个控件都知道自己要与哪个数据建立关联就好了。
比如我们现在准备写一个ListBox的项的数据模板,也就是给ListBoxItem添加一个数据外衣:让每一个ListBoxItem都是一个左边是人的头像,右边是上下分布,上面显示人名下面显示人的个性签名的列表。该怎么实现呢?
第一步:创建一个空UserControl,现根据上面的需求写好布局。
<Border BorderBrush="Blue" BorderThickness="1" CornerRadius="6">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="86"/>
<ColumnDefinition Width="200"/>
</Grid.ColumnDefinitions>
<Image Grid.Column="0" Source="pack://application:,,,/MyTemplete;component/Pic/bobo.jpg" Margin="6"/>
<StackPanel Grid.Column="1" Orientation="Vertical" VerticalAlignment="Center" Margin="6 0">
<TextBlock Text="博哥" Foreground="Green" FontSize="22" TextAlignment="Left" Margin="0 6"/>
<TextBlock Text="知之为知之,不知为不知,是知也!哈哈哈哈!!!" Foreground="Brown" FontSize="18" TextWrapping="Wrap" TextAlignment="Left" Margin="0 6"/>
</StackPanel>
</Grid>
</Border>
在编辑器里面的预览图:

第二步:创建一个用户信息实体类UserInfo,属性有UserLogo、UserName、UserWords。
/// <summary>
/// 用户信息
/// </summary>
public class UserInfo
{
/// <summary>
/// 用户名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 用户头像
/// </summary>
public string UserLogo { get; set; }
/// <summary>
/// 个性签名
/// </summary>
public string UserWords { get; set; }
}
第三步:新建一个资源字典ListBoxStyle.xaml,写入资源<DataTemplete></DataTemplete> 设置好资源的key比如就叫myListBoxItemDataTemplete和DataType(数据模板依赖哪个目标数据类型)
<DataTemplate x:Key="MyListBoxItemTemplete" DataType="{x:Type local:UserInfo}">
<Border BorderBrush="Blue" BorderThickness="1" CornerRadius="6">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="200"/>
</Grid.ColumnDefinitions>
<Image Grid.Column="0" Source="{Binding UserLogo}" Margin="6 0"/>
<StackPanel Grid.Column="1" Orientation="Vertical" VerticalAlignment="Center" Margin="6 0">
<TextBlock Text="{Binding UserName}" Foreground="Green" FontSize="22" TextAlignment="Left" Margin="0 6"/>
<TextBlock Text="{Binding UserWords}" Foreground="Brown" FontSize="18" TextWrapping="Wrap" TextAlignment="Left" Margin="0 6"/>
</StackPanel>
</Grid>
</Border>
</DataTemplate>
PS:这里最好设置我们的数据模板要给哪种数据类型做外衣,先指定了DataType以后,下面的Binding才会智能提示,UserName等属性。
第四步:在程序窗口中,添加LisBox,并设置ListBox的ItemTemplete属性的资源值是myListBoxItemDataTemplete。在后台添加C#代码组装数据,设置数据源。
在进行这一步之前,别忘记把我们写的数据模板引入到App.xaml里面,这样ListBox才能识别到。
<Application x:Class="MyTemplete.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyTemplete"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Style/ListBoxStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
我把数据模板写到了ListBoxStyle.xaml资源字典里面了,接下来在主窗体写入ListBox:
<ListBox Name="MyListBox" HorizontalAlignment="Center" ItemTemplate="{StaticResource MyListBoxItemTemplete}"/>
public MainWindow()
{
InitializeComponent();
List<UserInfo> userInfos = new List<UserInfo>()
{
new UserInfo(){UserLogo="pack://application:,,,/MyTemplete;component/Pic/chaoge.jpg",UserName="超哥",UserWords="我就是天天要带坑货队友吃鸡的花满楼,砖石玩家了解一下。"},
new UserInfo(){UserLogo="pack://application:,,,/MyTemplete;component/Pic/minshener.jpg",UserName="敏婶儿",UserWords="我走中路,法师让给我我贼溜。我排位3000场,我贼稳。下路鲁班巡航导弹支援一下。"},
new UserInfo(){UserLogo="pack://application:,,,/MyTemplete;component/Pic/bobo.jpg",UserName="博哥",UserWords="知之为知之,不知为不知,是知也。学而时习之,不亦乐乎。"},
};
MyListBox.ItemsSource = userInfos;
}
至此,我们的数据模板的分享就结束了。效果图如下:

我的项目目录结构:

问题:ListBoxItem设置完数据模板之后,还能再设置控件模板么?
答:当然可以了,控件模板是任何一个控件都有的属性。数据模板和控件模板是两个概念,它两个同时使用都没问题。
WPF-数据模板的更多相关文章
- WPF数据模板和控件模板
WPF中有控件模板和数据模板,控件模板可以让我们自定义控件的外观,而数据模板定义了数据的显示方式,也就是数据对象的可视结构,但是这里有一个问题需要考虑,数据是如何显示出来的?虽然数据模板定义了数 ...
- WPF数据模板样式选择器
在使用数据模板样式选择器时,不能设置ItemContainerStyle的属性值,如果设置了该值,那么数据模板样式选择器会失去作用. 在使用数据模板样式选择器时,首先要创建数据模板样式选择器对象,此对 ...
- WPF数据模板(7)
数据模板常用在3种类型的控件, 下图形式: 1.Grid这种列表表格中修改Cell的数据格式, CellTemplate可以修改单元格的展示数据的方式. 2.针对列表类型的控件, 例如树形控件,下拉列 ...
- WPF数据模板中绑定事件不触发问题
今天比较闲,做一个练手的项目,结果在xaml中写了一个用户的数据模板后,在其中的某个Canvas上绑定了一个鼠标左击的事件,结果调试的时候,无论怎么点击都不跳到断点那里,百思不得其解. 之后尝试不绑定 ...
- WPF数据模板的数据触发器的使用
<Window x:Class="CollectionBinding.MainWindow" xmlns="http://schemas.micros ...
- WPF 数据模板使用值转换器
<Window x:Class="CollectionBinding.MainWindow" xmlns="http://schemas.micros ...
- WPF 数据模板DataType属性的使用,不用指定ItemTemplate
<Window x:Class="CollectionBinding.MainWindow" xmlns="http://schemas.micros ...
- WPF 数据模板的使用
<Window x:Class="CollectionBinding.MainWindow" xmlns="http://schemas.micros ...
- WPF的ComboBox 数据模板自定义
WPF的ComboBox 有些时候不能满足用户需求,需要对数据内容和样式进行自定义,下面就简要介绍一下用数据模板(DataTemplate)的方式对ComboBox 内容进行定制: 原型设计如下: 步 ...
- WPF中的数据模板(DataTemplate)(转)
原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/30/694388.html WPF中的数据模板(DataTemplate) ...
随机推荐
- PHP面试题2019年搜狐面试题及答案解析
一.单选题(共27题,每题5分) 1.阅读下面PHP代码,并选择输出结果( ) A.0 B.1 C.2 D.3 参考答案:D 答案解析:static属性常驻内存 2.PHP单例模式操作描述错误的是? ...
- 一文解读ARM架构 (转)
本文主要介绍的是arm架构和x86架构的区别,首先介绍了ARM架构图,其次介绍了x86架构图,最后从性能.扩展能力.操作系统的兼容性.软件开发的方便性及可使用工具的多样性及功耗这五个方面详细的对比了a ...
- [转]5 种使用 Python 代码轻松实现数据可视化的方法
数据可视化是数据科学家工作中的重要组成部分.在项目的早期阶段,你通常会进行探索性数据分析(Exploratory Data Analysis,EDA)以获取对数据的一些理解.创建可视化方法确实有助于使 ...
- 非ssl给163发邮件,报错,无解ing
#给163发送邮件import smtplibfrom email.mime.text import MIMETextnam='15527721040@163.com'send='1552772104 ...
- ar 归档
ar的常用用法见正文. 1.创建库文件 我 不知道怎么创建一个空的库文件.好在这个功能好像不是很需要.通常人们使用“ar cru liba.a a.o"这样的命令来创建一个库并把a.o添加进 ...
- Python自动化运维之高级函数
本帖最后由 陈泽 于 2018-6-20 17:31 编辑 一.协程 1.1协程的概念 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程.(其实并没 ...
- (转)新建maven项目时报错Error:Maven Resources Compiler: Maven project configuration required for module 'XX'解决方法
转载地址:https://blog.csdn.net/qq784515681/article/details/85070195 在新建maven项目时,Problems中报错: Error:Maven ...
- layUI学习第一日:myeclipse中使用layUI
第一步:下载layUI,网址:https://www.layui.com/ 第二步:查看layUI解压后的内容,和官网解释各个文件夹的内容 第三部:在myeclipse中新建一个web project ...
- [东西]neverOpen
一.介绍 用于完成一项光荣而伟大的使命. 二.更新日志 当前版本:V5.0 - 20191107 --------------------------------------------------- ...
- c# 多线程 双色球
学习记录.仅供参考. 知识点: 多线程 Lock 环境: Visual Studio 2017 public partial class Form1 : Form { private static r ...