2013-07-08 2 views
0

Я создал CollectionViewSource следующим образом:CollectionViewSource Группировка "Все элементы"

<CollectionViewSource x:Key="MyGrouping" Source="{Binding MyCollection}"> 
    <CollectionViewSource.SortDescriptions> 
     <componentModel:SortDescription PropertyName="Name"/> 
    </CollectionViewSource.SortDescriptions> 
    <CollectionViewSource.GroupDescriptions> 
     <PropertyGroupDescription PropertyName="Type"/> 
    </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 

Я тогда определим TabControl следующим образом:

<TabControl ItemsSource="{Binding Groups, Source={StaticResource MyGrouping}}"> 
    <TabControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}"/> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
      <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False"> 
       <DataGrid.Resources> 

.....

Все группировка работает отлично. Однако я хотел добавить дополнительную вкладку, содержащую ВСЕ элементы (негруппированные).

Есть ли простой подход к mvvm для этого? Любая помощь будет принята с благодарностью.

ответ

1

Основная идея - создать пользовательский ListCollectionView с настраиваемой CollectionViewGroup. Ниже приведен пример.

public class CustomGroupListCollectionView : ListCollectionView 
{ 
    private readonly CustomGroup _allGroup; 

    public CustomGroupListCollectionView(IList list) 
     : base(list) 
    { 
     _allGroup = new CustomGroup("All"); 
     foreach (var item in list) 
     { 
      _allGroup.AddItem(item); 
     } 
    } 

    public override ReadOnlyObservableCollection<object> Groups 
    { 
     get 
     { 
      var group = new ObservableCollection<object>(base.Groups.ToList()); 
      group.Add(_allGroup); 
      return new ReadOnlyObservableCollection<object>(group); 
     } 
    } 
} 

public class CustomGroup : CollectionViewGroup 
{ 
    public CustomGroup(object name) 
     : base(name) 
    { 
    } 

    public void AddItem(object item) 
    { 
     ProtectedItems.Add(item); 
    } 

    public override bool IsBottomLevel 
    { 
     get { return true; } 
    } 
} 
+0

Это прекрасно работает! Спасибо! – gleng

+0

Bill, как бы вы получили базовую сортировку (из xaml) и применили ее к новой группировке (все элементы)? – gleng

+0

Ага, вот что я имею в виду базовую идею. Если вы хотите добавить больше функциональных возможностей, таких как сортировка и фильтрация, придет боль. Я этого не делал. Вы можете прислушиваться к событию CollectionChanged SortDescriptions, а затем сортировать _allGroup вручную в обработчике событий. –

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