2016-12-12 3 views
0

У меня есть ViewModel, который используется в Windows 8, Android и iOS в рамках проекта Xamarin. Теперь мне нужно отобразить эту виртуальную машину в ListView в WPF.WPF - Использование CollectionViewSource с УЖЕ сгруппированными данными

Эта VM предоставляет некоторые уже сгруппированные данные как ObservableCollection<GroupedResult<string, SearchResult>>. GroupResult имеет свойство Key (String) и IEnumerable Source свойство

С в Windows 8 ListView я могу назначить эти данные к CollectionViewSource (CVS), скажите CVS путь к свойству Items PropertyPath("Source") и она отлично работает.

Однако WPF, похоже, хочет, чтобы негруппированный список загружался в его CVS, чтобы он мог группировать все это сам. Как сообщить CVS WPF, что VM содержит уже сгруппированные данные?

ответ

0

Я боюсь, что класс System.Windows.Data.CollectionViewSource в WPF не имеет свойства IsSourceGrouped или эквивалента, поэтому вы не можете сказать, что данные уже сгруппированы.

У вас в основном есть два варианта.

  1. Ungroup коллекции источника и установить источник свойство CollectionViewSource к разгруппирована коллекции и добавить PropertyGroupDescription своей коллекции GroupDescriptions как обычно: https://msdn.microsoft.com/en-us/library/ms742542(v=vs.110).aspx

  2. Установите источник группового сбора и определит ItemTemplate для объектов Группировка:

    public MainWindow() 
    { 
        InitializeComponent(); 
        List<User> items = new List<User>(); 
        items.Add(new User() { Name = "John Doe", Age = 42, Sex = SexType.Male }); 
        items.Add(new User() { Name = "Jane Doe", Age = 39, Sex = SexType.Female }); 
        items.Add(new User() { Name = "Sammy Doe", Age = 13, Sex = SexType.Male }); 
    
        var result = 
         from x in items 
         group x by x.Sex into g 
         orderby g.Key 
         select g; 
    
        listBox.ItemsSource = result; 
    } 
    

<ListBox x:Name="listBox"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Expander Header="{Binding Key}"> 
        <ListBox ItemsSource="{Binding}"> 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
           <StackPanel> 
            <TextBlock Text="{Binding Name}"/> 
           </StackPanel> 
          </DataTemplate> 
         </ListBox.ItemTemplate> 
        </ListBox> 
       </Expander> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
+0

Я счастлив предположить, что источник сгруппирован и задает шаблоны. Я буду отображаться в ListView, а не в ListBox, если бы мне хотелось, чтобы разделы всегда были расширены, если не пустые, вы можете предложить контейнер, отличный от Expander? –

+0

Что случилось с Expander? Вы можете установить для IsExpanded значение true, чтобы оно было расширено по умолчанию. И если вы не хотите расширять/сворачивать группы, вы можете просто удалить расширитель и использовать ListBox или ItemsControl в качестве корневой панели DataTemplate. – mm8

+0

Я пытаюсь имитировать GroupStyle HidesIfEmpty = «True», который я успешно использовал в Win8. Как вы предположили, я заменю расширитель каким-нибудь другим. Спасибо –

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