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. Python入门你要懂哪些?

    前言 什么是计算机语言 计算机就是一台用来计算的机器,人让计算机干什么计算机就得干什么! 需要通过计算机的语言来控制计算机(也就是编程语言)! 计算机语言其实和人类的语言没有本质的区别,不同点就是交流 ...

  2. 清新水墨色中国风通用教育培训课件PPT模板

    模板来源:http://ppt.dede58.com/jiaoxuekejian/26220.html

  3. 微信小程序和支付宝小程序富文本使用

    微信小程序使用的是 1. wxml 页面元素的最简单使用 <rich-text nodes="{{这是你的数据}}"></rich-text>   2. j ...

  4. 定制Dynamics CRM标准导出功能:不能导出指定列的值

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复239或者20161203可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  5. Xcode打印如下错误:Unbalanced calls to begin/end appearance transitions 解决办法

    今天在做自己的项目时遇到如下错误,项目运行以后,打印台打印如下: Unbalanced calls to begin/end appearance transitions for <HomeVi ...

  6. iOS中WebSocket的使用

    https://github.com/square/SocketRocket 简单使用如下 1.初始化socket _webSocket = [[SRWebSocket alloc] initWith ...

  7. Django和前端用ajax传输json等数据

    需要传输的是下图中所有的input中客户端设置的数据 整个页面是用js生成,代码不长,但是用了许多拼接,看起来开比较乱,页面的核心就是下面的部分,有一些关键参数部分就不放了,可以跳过这个 下面开始重点 ...

  8. [Go] 并发imap收信

    并发数太大会直接死,这里有时候需要多试几次 package main import ( "flag" "fmt" "io/ioutil" & ...

  9. 关于ML.NET v1.0 的发布说明

    今天,我们很高兴宣布发布 ML.NET 1.0.ML.NET 是一个免费的.跨平台的开源机器学习框架,旨在将机器学习(ML)的强大功能引入.NET 应用程序. ML.NET GitHub:https: ...

  10. C++踩坑——用memset对vector进行初始化

    在一段程序中,使用memset对vector进行了初始化,然后得到了错误的结果.找这个bug花费了很长时间. vector中有其自身的结构,不能单纯的按字节进行初始化.使用memset对vector进 ...