【问题标题】:Multiple format types listview in C# and XAMLC# 和 XAML 中的多种格式类型列表视图
【发布时间】:2016-07-08 22:37:43
【问题描述】:

我正在创建一个带有显示消息对象的列表视图的消息传递应用程序。

当新用户加入时,我想添加(例如)“约翰加入”,但我希望它的格式不同于消息。

我怎样才能做到这一点?

【问题讨论】:

    标签: c# windows xaml uwp


    【解决方案1】:

    对于这种场景,可以实现ListViewItemsControl.ItemTemplateSelector property

    例如,首先创建一个继承自DataTemplateSelector 的类,如下所示:

    public class MessageDataTemplateSelecotr : DataTemplateSelector
    {
        public DataTemplate NormalTemplate { get; set; }
        public DataTemplate JoinedTemplate { get; set; }
        protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
        {
            var message = item as MessageModel;
            if (message.MessageType.ToString() == "Normal")
                return NormalTemplate;
            else
                return JoinedTemplate;
        }
    }
    

    然后你可以像这样使用这个选择器:

    <Page.Resources>
        <DataTemplate x:Key="NormalMessageTemplate">
            <TextBlock Text="{Binding Message}" FontSize="20" Foreground="Blue"/>
        </DataTemplate>
        <DataTemplate x:Key="JoinedMessageTemplate">
            <TextBlock Text="{Binding Message}" FontSize="15" Foreground="Red"/>
        </DataTemplate>
        <local:MessageDataTemplateSelecotr x:Key="MessageDataTemplateSelecotr" 
                                           NormalTemplate="{StaticResource NormalMessageTemplate}" 
                                           JoinedTemplate="{StaticResource JoinedMessageTemplate}"/>
    </Page.Resources>
    
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <ListView ItemTemplateSelector="{StaticResource MessageDataTemplateSelecotr}" ItemsSource="{x:Bind listViewCollection}"/>
    </Grid>
    

    在后面的代码中,只需将数据添加到listViewCollection 中,如下所示:

    ObservableCollection<MessageModel> listViewCollection = new ObservableCollection<MessageModel>();
    private enum _MessageType
    {
        Normal,
        Joined
    }
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        listViewCollection.Add(new MessageModel { Message = "hello world!", MessageType = _MessageType.Normal });
        listViewCollection.Add(new MessageModel { Message = "John joined", MessageType = _MessageType.Joined });
    }
    

    而我的MessageModel 班级是这样的:

    public class MessageModel
    {
        public string Message { get; set; }
        public Enum MessageType { get; set; }
    }
    

    这个ListView的渲染图在这里:

    【讨论】:

    • 在与
    • @Jenny,据我所知,这是一个已知问题,忽略它就可以了。
    【解决方案2】:

    看看这个问题的公认答案ItemsControl with multiple DataTemplates for a viewmodel

    您可以将 CompositionCollection 与列表视图中定义的两个数据模板一起使用。一个用于普通消息的数据模板,一个用于连接消息。

    【讨论】:

    • 不,OP问了一个关于UWP应用的问题,你提供了一个关于WPF应用的方法。请注意问题的标签。
    猜你喜欢
    • 2016-10-20
    • 1970-01-01
    • 2015-11-06
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多