Как работают GroupStyles?

у меня есть элемент управления ListView, привязанный к ListCollectionView в ViewModel.

Я хотел попытаться сгруппировать эти элементы, но возникли некоторые проблемы.

Я установил группировку свойств в виртуальной машине для начала, а затем добавил GroupStyle.

C#:

ListCollectionView.GroupDescriptions.Add(new PropertyGroupDescription("Category"));

XAML:

<ListView.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                 <TextBlock Text="{Binding Path=Name}"/>
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ListView.GroupStyle>

однако список теперь только имена категорий, нет способа увидеть сами элементы.

Я не совсем понимаю, что такое продолжайте. Когда я создаю шаблон GroupStyle к чему я действительно привязан? Есть ли другие свойства, кроме Name ?

Я только что добавил GroupStyle в ListView я уже создал, где я, например, включил ItemTemplate. Это что-то, что возится с GroupStyle?

что делать, если элементы в списке принадлежат другому классу, и я не хочу группировать на основе того, к какому экземпляру класса они принадлежат (он имеет идентификатор). Тогда у меня будет название группы как свойство этого родительского класса. Это возможно?

ЧАСТИЧНОЕ РЕШЕНИЕ:

проблема заключалась в стиле, применяемом в ListView. Я не знаю насчет стиля был interefering.

РЕШЕНИЕ

Я не использую ItemsPresenter в моем списке ControlTemplate решив использовать панель с IsItemsHost значение true. Кажется, ItemsPresenter должен использоваться для GroupStyling для правильной работы.

1 ответов


Я думаю, что ошибка лежит в другом месте вашего кода.

обычно вы выставляете коллекцию модели на ViewModel

namespace Derp
{
    public sealed class ViewModel
    {
      public ObservableCollection<Model> Items {get;set;}
      // initialization code not shown
    }

    public sealed class Model
    {
      public string GroupName {get;set;}
      public string ModelName {get;set;}
    }
}

на ваш взгляд, вы привязываете CollectionViewSource в этой коллекции:

<Window.DataContext>
    <ViewModel xmlns="clr-namespace:Derp" />
</Window.DataContext>
<Window.Resources>
    <CollectionViewSource
        Source="{Binding Items}"
        x:Key="GroupedItems">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription
                PropertyName="GroupName" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
</Window.Resources>

Далее мы привязываем наш элемент управления списком к этому CollectionViewSource (используя комбинацию в этом примере):

<ComboBox
    ItemsSource="{Binding Source={StaticResource GroupedItems}}"
    DisplayMemberPath="ModelName">
    <ComboBox.GroupStyle>
        <GroupStyle>
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <TextBlock
                        Text="{Binding Name}" />
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </ComboBox.GroupStyle>
</ComboBox>

где он может запутаться, это то, что внутри GroupStyle, вы не связываете против вашего модель, вы связываетесь с коллекцией модели который сгруппирован по (в данном случае) свойству"имя группы". The CollectionViewSource группы модели в коллекции, расширяющие CollectionViewGroup. Эти группы имеют свойство под названием Name, который содержит общее значение, на котором ваш модели несколько сгруппированы (значение GroupName свойства). Итак, в HeaderTemplate, Вы являются обязательными для CollectionViewGroup.Название.