c - UWP - 刷新 ListView 和 CollectionViewSource

标签 c xaml listview uwp collectionviewsource

我已经创建了 ChatMessageGroupChatMessageGroupCollection 以及 ListView 并将 ItemsSource 设置为 CollectionViewSource:

<ListView x:Name="ChatMessageLv" ItemsSource="{Binding SelectedChat.ChatMessageGroupCollection.Cvs.View}" ItemTemplateSelector="{StaticResource ChatMessageDataTemplateSelector}">


public class ChatMessageGroup : IGrouping<DateTime, ChatMessage>, INotifyCollectionChanged
    {
        private ObservableCollection<ChatMessage> _chatMessages;
        public DateTime Key { get; set; }

        public ObservableCollection<ChatMessage> ChatMessages
        {
            get { return _chatMessages; }
            set
            {
                if (_chatMessages != null)
                    _chatMessages.CollectionChanged -= CollectionChanged;

                _chatMessages = value;
                _chatMessages.CollectionChanged += CollectionChanged;
            }
        }


        public ChatMessageGroup()
        {
            ChatMessages = new ObservableCollection<ChatMessage>();
        }

        public IEnumerator<ChatMessage> GetEnumerator()
        {
            return ChatMessages.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        public event NotifyCollectionChangedEventHandler CollectionChanged;
    }


 public class ChatMessageGroupCollection : IEnumerable<ChatMessageGroup>
    {
        private readonly ObservableCollection<ChatMessageGroup> _groups;

        public ObservableCollection<ChatMessage> Source { get; set; }
        public CollectionViewSource Cvs { get; set; }

        public ChatMessageGroupCollection(ObservableCollection<ChatMessage> messages)
        {
            Source = messages;
            messages.CollectionChanged += Messages_CollectionChanged;

            var groups = messages
                .GroupBy(GetGroupKey)
                .Select(x => new ChatMessageGroup()
                {
                    Key = x.Key,
                    ChatMessages = x.OrderBy(GetGroupKey).ToObservableOrDefault()
                })
                .OrderBy(x => x.Key);

            _groups = new ObservableCollection<ChatMessageGroup>(groups);
            Cvs = new CollectionViewSource() { IsSourceGrouped = true, Source = _groups };
        }
...

这里一切正常,除了组集合中的更改:

_groups.Add(new ChatMessageGroup()); -> this line reflect changes in ListView

但如果我这样做:_groups[0].ChatMessages.Add(new ChatMessage()) 即使 ChatMessageGroup 正在实现 它也不起作用>INotifyCollectionChanged 并在每次 ChatMessages ObservableCollection 更改时引发。 解决方法是更新 ChatMessages 并从 _groups 中删除组,然后再次添加,但这不是解决方案。 CollectionViewSource 上的 Refresh() 在 UWP 中不可用。还有其他解决方案吗?

最佳答案

虽然这在技术上不符合问题的答案,但我认为它可能符合架构答案。

在 WPF 中基于底层集合变化进行分组 ListView 更新的方法与设置 IsLiveGroupingRequested 一样简单。在 XAML 中声明的 CollectionViewSource 实例上为 true

由于我一直在研究 UWP(在使用 WPF 将近十年之后),我得出的结论是,Microsoft 通过疏忽暗示这不是解决 UWP 问题的正确方法。因此,自行实现该功能的长度可能会被解释为在某种程度上忽略了这一点。

在我的特殊情况下,我决定完全改变我的方法并将渲染实现为 ListView 的多个实例,而不是将旧范例强加到新平台上。

这个结果实际上让我找到了一个改善我的用户体验的解决方案。

深思......

关于c - UWP - 刷新 ListView 和 CollectionViewSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35241818/

相关文章:

c - 获得意外的错误输出

c - 静态链接英特尔CRT

wpf - 在 WPF 数据网格中的列之间禁用制表位

java - 当 ListView 中没有项目(显示空 View )时,我想删除 optionMenu?

android - 如何删除 SQL 数据库中的项目?

c++ - main() 内外的字符指针声明

c - 为什么结构成员似乎有一个溢出值?

c# - WPF CheckBox : Why? 的选中和未选中状态的单独事件

wpf - 从上下文菜单项绑定(bind)到父控件

php - yii2 从 ListView 中删除摘要/计数