2016-02-06 58 views
1

我已经创建ChatMessageGroupChatMessageGroupCollectionListViewItemsSource设置为CollectionViewSourceUWP - 清爽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更改分组列表视图更新的方法是,在XAML中声明的CollectionViewSource实例设置IsLiveGroupingRequestedtrue一样简单。因为我一直在通过UWP工作(经过近十年的WPF),我得出的结论是,微软通过遗漏暗示这不是UWP问题的正确方法。所以,自己去实现这个功能的长度可能会被解释为在某种程度上忽略了这一点。

在我的特殊情况下,我决定完全改变我的方法,并将渲染作为多个实例ListView s来执行,而不是强制将旧范式强制到新平台上。

这样做的结果实际上使我得出了一个解决方案,可以将我的UX提升为启动。

食物的思考...