WPF中DataTemplateSelector的简单应用
WPF中DataTemplateSelector的简单应用
DataTemplateSelector中文叫数据模板选择器,根据数据模型内的属性值选择不同的数据模板,多用于容器如listbox中,达到同一个DataContext却展示的样式不同的效果。
在这里我将举一个聊天效果展示的例子。
首先我们需要在有listbox的界面添加两个简单的DataTemplate
看得出来我们的样式差不多,绑定的数据也是一样,那么接下来就要实现一个DataTemplateSelector,我们自定义的ChatMessageDataTemplateSelector需要继承DataTemplateSelector,并重写SelectTemplate()方法。
public class ChatMessageDataTemplateSelector : DataTemplateSelector
{
public DataTemplate LeftMessageTemplate { get; set; }
public DataTemplate RightMessageTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
Message message = item as Message; //CombinedEnity为绑定数据对象
bool isSendByMe = message.IsSendByMe;
if (isSendByMe)//是否为我发送的,我发送的则是右侧消息样式,他人发送则为左侧样式。
{
return RightMessageTemplate;
}
else
{
return LeftMessageTemplate;
}
}
}
在界面中,我们需要在ListBox的ItemTemplateSelector属性中定义:
<ListBox x:Name="Message" Grid.Row="1" HorizontalAlignment="Stretch">
<ListBox.ItemTemplateSelector>
<local:ChatMessageDataTemplateSelector LeftMessageTemplate="{StaticResource LeftMessage}"
RightMessageTemplate="{StaticResource RightMessage}">
</local:ChatMessageDataTemplateSelector>
</ListBox.ItemTemplateSelector>
</ListBox>
最后,我们给ListBox加上Items,Item的Model是一个Message类:
public class Message
{
/// <summary>
/// 团队ID
/// </summary>
public string TeamId { get; set; }
/// <summary>
/// 成员用户名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 成员昵称
/// </summary>
public string NickName { get; set; }
/// <summary>
/// 消息时间
/// </summary>
public string SendTime { get; set; }
/// <summary>
/// 消息内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 是否为我发送的
/// </summary>
public bool IsSendByMe { get; set; }
}
由此,我们就可以根据每一个Item的Model中的IsSendByMe来判断我们需要展示哪个样式啦。我们还可以增加更多的样式,在ChatMessageDataTemplateSelector做选择就好。
ps:具体的聊天服务,是用signalr实现前后端极其简单https://docs.microsoft.com/en-us/aspnet/signalr/。
WPF中DataTemplateSelector的简单应用的更多相关文章
- WPF中的触发器简单总结
原文 http://blog.sina.com.cn/s/blog_5f2ed5cb0100p3ab.html 触发器,从某种意义上来说它也是一种Style,因为它包含有一个Setter集合,并根据一 ...
- wpf中,一个简单的自定义treeview
首先创建一个自定义控件,在里面定义好treeview的样式,将本来的三角形的图标变为加号的图标,并且添加节点之间的连线. <UserControl x:Class="TreeViewE ...
- WPF之DataTemplateSelector的运用
本文主要记录WPF中DataTemplateSelector的运用,数据模板选择器主要运用在一些项容器中用于根据不同的数据类型选择不同的DataTemplate,以便展示不同的数据.在此以在listb ...
- WPF中使用MVVM模式进行简单的数据绑定
计划慢慢整理自己在WPF学习和工作应用中的一些心得和想法,先从一个简单的用法说起 在WPF中,XAML标记语言中绑定数据,而数据源就是指定为ViewModel类,而非界面本身的逻辑代码类 这样一定程度 ...
- WPF中的简单水动画
原文 https://stuff.seans.com/2008/08/21/simple-water-animation-in-wpf/ 很多年前(80年代中期),我在一家拥有Silicon Grap ...
- 简单的介绍下WPF中的MVVM框架
最近在研究学习Swift,苹果希望它迅速取代复杂的Objective-C开发,引发了一大堆热潮去学它,放眼望去各个培训机构都已打着Swift开发0基础快速上手的招牌了.不过我觉得,等同于无C++基础上 ...
- 在WPF中使用依赖注入的方式创建视图
在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...
- MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信
MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
随机推荐
- JS如何判断是否已经引入某个css或是js?
http://bbs.csdn.net/topics/390541081 function isInclude(name){ var js= /js$/i.test(name); va ...
- 存储系列之 硬盘接口与SCSI总线协议
本文主要介绍硬盘的接口.总线和协议,SSD与SATA硬盘一般是兼容的,NVmeSSD除外. 一.磁盘控制器 上一章介绍了存储系统的主要介质硬盘,而硬盘的读写通过磁头臂,磁头臂是由磁盘驱动器来控制的.磁 ...
- iOS不移除通知也不会崩溃原因
在iOS9.0之前,通知中心对观察者对象进行unsafe_unretained 引用,当被引用的对象释放时不会自动置为nil,,也就是成了野指针. iOS9.0之后通知中心对观察者做了弱引用. 参考: ...
- 朱刘算法 有向图定根的最小生成树poj3164
关于为什么不能用Prim求解此类问题,如下 Prim可以看成是维护两个顶点集或者看成维护一颗不断生成的树(感觉前一种说法好一点) 倘若是有向图有三个顶点1.2.3 边的情况如下 1->2: ...
- 软链接 vs. 硬链接
链接大家都用过,比如 Windows 中的快捷方式就是一种链接,可是 Linux 里又分硬链接和软链接,它们表示什么意思,又有什么区别呢,本文来给大家做一个解释. Inode 索引节点 要想理解硬链 ...
- poi 针对word模板内容替换
最近多了一个需求,需要对word模板内容进行替换,一开始用的是word03版的,替换起来比较简单,主要是range对像替换非常方便,而且可以保留替换前的字体样式. InputStream is = n ...
- JS中Class的两种写法
写法一:使用函数: var ClassName = function() { this.message = 'dat.gui'; this.speed = 0.8; this.displayOutli ...
- Python Redis常用操作(持续更新)
目录 1.Redis简介 2.Redis部署 3.Redis API应用 4.String操作 1.Redis简介 redis是业界主流的key-value,nosql数据库之一.和Memcached ...
- Android_存储之scoped storage&媒体文件
Scoped storage 文件存储介绍了内部存储和外部存储相关的内容.因为外部存储容易读写,所以在手机中经常看到很多“乱七八糟”的文件或文件夹,这些就是应用肆意创建的. Android Q(10) ...
- django-CBV刨析、模板层
今日内容概要 CBV源码剖析 模版层 模版语法传值 模版语法之过滤器 模版语法之标签 自定义过滤器.标签及inclusion_tag 模版的继承 模版的导入 FBV与CBV ""& ...