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比如就叫myListBoxItemDataTempleteDataType(数据模板依赖哪个目标数据类型)

<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-数据模板的更多相关文章

  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. JS实现深浅拷贝

    1.实现浅拷贝 // 1. ...实现 let copy1 = {...{x:1}} // 2. Object.assign实现 let copy2 = Object.assign({}, {x:1} ...

  2. 在vcs中编译及运行测试E203例子

    E203的Makefile默认是调用 iverilog编译rtl,我们可以做如下修改,使其支持vcs编译. 1. 首先修改e200_opensource/tb/tb_top.v, 增加dump波形的两 ...

  3. C# 运行时的关系

    简介 记录c#对象在托管堆中运行时的相互关系,如下记录了一个方法在执行时候的生命周期,当方法在之前,CLR会先执行将方法里面所有用到的局部变量.参数对应的内存地址等全部存放当前线程栈当中,并且会将所有 ...

  4. docker 简单介绍与安装

    主机虚拟化(vmware,visual box等) type-Ⅰ type=Ⅱ 主机虚拟化是隔离最彻底的,但是由于多隔了一个虚拟的操作系统,性能会慢一些. 容器虚拟化(docker等) 隔离没有主机虚 ...

  5. selenium添加chrome配置项

    selenium虽然强大,但也有不方便的地方,selenium每次启动浏览器都是一个全新的浏览器,并没有加载任何的配置,这样在爬取一些需要登陆才能看到的页面时就有些不太方便.但我们可以通过加载chro ...

  6. C++ class内的 ++ 重载,左++,右++,重载示例。

    #include <iostream> // overloading "operator ++ " inside class // ++ 是一元操作符 //////// ...

  7. NOIP模拟赛 拓展

    题目描述 Description \(φ\) 函数是数论中非常常用的函数.对于正整数 \(x\) ,\(φ(x)\) 表示不超过 \(x\) 的所有正整数与 \(x\) 互质的个数. 现在我们对它进行 ...

  8. CentOS单机安装FastDFS&整合Nginx

    单机安装 一 准备工作 准备linux服务器或虚拟机,这里是虚拟机,操作系统CentOS 6.4 Tracker 和 Storage 安装在一台机器上 FastDFS 5.08版本 1,准备软件 软件 ...

  9. SQL Server 创建 修改 删除数据表

    1. 图形界面方式操作数据表 (1)创建和修改数据表 列名中如果有两个以上单词时,最好用下划线连接,否则可能会给将来的查询维护带来不便.我们公司美国佬做的数据库就很烦,所有列名都有空格,一旦忘记用方括 ...

  10. C语言——初见指针

    指针 指针是存放变量地址的变量. 由此我们可以知道了,指针存放的是变量地址且只能应用于内存中对象,指针本身也是一个变量.但是指针不仅仅可以存储变量地址,还可以是其他例如函数指针. C语言程序运行时,内 ...