2016-02-06 3 views
1

Я создал 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 и поднимается каждый раз, когда ChatMessagesObservableCollection изменен. Обходным путем является обновление ChatMessages и удаление группы из _groups, а затем добавление его снова, но это не решение. Refresh() на CollectionViewSource не доступен в UWP. Есть ли другие решения?

+0

заголовки групп могут быть реализованы несколько способов, так что вы пытаетесь достичь - вы можете обновить ваш вопрос, пожалуйста? –

+0

У меня есть сгруппированный CollectionViewSource. Я хочу обновить содержимое коллекции, и ListView должен обновить его содержимое – MistyK

+0

@Zbigniew, смогли бы вы решить эту проблему? В WPF есть CollectionViewSource.View.Refresh(), но в UWP не существует решения! – DeannaD

ответ

0

Хотя это технически не квалифицируется как ответ на вопрос, который, как я думаю, может квалифицироваться как архитектурный ответ.

Способ сделать сгруппированный обновление представления списка на основе базовой коллекции меняющегося в WPF так же просто, как установка IsLiveGroupingRequested к true на CollectionViewSource экземпляра, объявленного в XAML.

Как я проработал свой путь через UWP (после почти десятилетия WPF), я пришел к выводу, что Microsoft предлагает без исключения, что это неправильный подход к проблеме для UWP. Таким образом, переход к длине реализации этой функции может быть истолкован как недостающая точка.

В моей конкретной ситуации я решил полностью изменить свой подход и реализовать рендеринг как множественный экземпляр ListView, а не форсировать старую парадигму на новую платформу.

Результат этого фактически заставил меня прийти к решению, которое улучшило мой UX для загрузки.

Пища для размышлений ...

Смежные вопросы