我已经创建了 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
更改时引发。
解决方法是更新 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/