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/。
posted @   aaayi  阅读(1266)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示