Как работает GroupStyles? - PullRequest
7 голосов
/ 24 мая 2011

У меня есть элемент управления 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. Я понятия не имею, что насчет стиля мешало.

ПОЛНОЕ РЕШЕНИЕ

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

1 Ответ

16 голосов
/ 24 мая 2011

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

Обычно вы выставляете коллекцию моделей на 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 вы не привязываетесь к своей модели , вы привязываете к коллекции моделей который сгруппирован (в данном случае) по свойству " GroupName ". CollectionViewSource группирует ваши Модели в коллекции, расширяющие CollectionViewGroup . Эти группы имеют свойство Name, которое содержит общее значение, по которому группируются ваши Модели (значение свойства GroupName). Итак, в HeaderTemplate вы привязываетесь к CollectionViewGroup.Name .

...