我创建了ChatMessageGroup
和ChatMessageGroupCollection
以及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
都会被提升。解决方法是更新聊天信息并从组中删除组,然后再次添加,但这不是一个解决方案。
Refresh()
onCollectionViewSource
在UWP中不可用。还有其他解决办法吗? 最佳答案
虽然这在技术上不符合问题的答案,但我认为它可能符合架构的答案。
基于WPF中的底层集合更改进行分组列表视图更新的方法非常简单,只需在XAML中声明的IsLiveGroupingRequested
实例上将true
设置为CollectionViewSource
。
当我一直在研究UWP(经过近十年的WPF)时,我得出了这样的结论:微软通过省略暗示这不是解决UWP问题的正确方法。因此,如果你自己去实现这个特性的话,可能会被理解为有些遗漏了这一点。
在我的特殊情况下,我决定完全改变我的方法,将呈现作为ListView
s的多个实例来实现,而不是将一个旧的范例强制到一个新的平台上。
这个结果实际上让我找到了一个解决方案,改进了我的UX启动。
思想食粮。。。
关于c - UWP-刷新listview和CollectionViewSource,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35241818/