Я создал 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