• 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/。
  • 相关阅读:
    多态
    接口和抽象类
    反射
    C++ 模板和 C# 泛型的区别
    基础类库中的泛型
    运行时中的泛型
    泛型代码中的 default 关键字
    泛型委托
    泛型方法
    泛型接口
  • 原文地址:https://www.cnblogs.com/codexiaoyi/p/13123746.html
Copyright © 2020-2023  润新知