我创建了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并且每次更改ChatMessagesObservableCollection都会被提升。
解决方法是更新聊天信息并从组中删除组,然后再次添加,但这不是一个解决方案。Refresh()onCollectionViewSource在UWP中不可用。还有其他解决办法吗?

最佳答案

虽然这在技术上不符合问题的答案,但我认为它可能符合架构的答案。
基于WPF中的底层集合更改进行分组列表视图更新的方法非常简单,只需在XAML中声明的IsLiveGroupingRequested实例上将true设置为CollectionViewSource
当我一直在研究UWP(经过近十年的WPF)时,我得出了这样的结论:微软通过省略暗示这不是解决UWP问题的正确方法。因此,如果你自己去实现这个特性的话,可能会被理解为有些遗漏了这一点。
在我的特殊情况下,我决定完全改变我的方法,将呈现作为ListViews的多个实例来实现,而不是将一个旧的范例强制到一个新的平台上。
这个结果实际上让我找到了一个解决方案,改进了我的UX启动。
思想食粮。。。

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

10-11 19:28