我已经创建ChatMessageGroup
和ChatMessageGroupCollection
和ListView
与ItemsSource
设置为CollectionViewSource
:UWP - 清爽ListView和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中删除组,然后再次添加它,但这不是解决方案。 Refresh()
CollectionViewSource
在UWP中不可用。还有其他解决方案吗?
组头可以用几种方式实现,所以你想完成什么 - 你能更新你的问题吗? –
我有一个分组的CollectionViewSource。我想更新集合的内容和ListView应该更新其内容 – MistyK
@Zbigniew,你能解决这个问题吗?在WPF中有一个CollectionViewSource.View.Refresh(),但在UWP中似乎没有解决方案! – DeannaD