Как работают 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.Название.