我有一个List组件,它绑定到xaml中的ListBox。 在视图模型中,我尝试使用CollectionViewSource,如下所示:
var groupedItems = CollectionViewSource.GetDefaultView(Components);
groupedItems.GroupDescriptions.Add(new PropertyGroupDescription("Category"));
groupedItems.GroupDescriptions.Add(new PropertyGroupDescription("SubCategory"));
Components集合中的某些对象(T)可以具有空的SubCategory。 现在,当呈现UI时,会出现一个空标题,用于对具有空SubCategory的对象进行分组,如下所示:
Category
--SubCategory
--Item 1
--Item 2
--
--Item 3
--Item 4
Category
......continues
我想要第3项和第3项。第4项没有子类别作为类别的直接子项出现如下:
Category
--Item 3
--Item 4
--SubCategory
--Item 1
--Item 2
Category
......continues
请指导如何实现这一目标。
此致
Nish26
答案 0 :(得分:0)
这个答案描述了基于样式选择器的方法。也许,有更好的方法可以获得类似的结果,我会高兴地看着它们。
样式选择器允许基于自定义逻辑应用样式。
以下选择器应检查Name
的{{1}}是否为CollectionViewGroup
并返回相应的样式:
null
值得一提的是,如果样式为public class GroupStyleSelector : StyleSelector
{
public Style NoGroupHeaderStyle { get; set; }
public Style DefaultGroupStyle { get; set; }
public override Style SelectStyle(object item, DependencyObject container)
{
var group = item as CollectionViewGroup;
if (group?.Name == null /* or any other condition */)
{
return NoGroupHeaderStyle;
}
return DefaultGroupStyle;
}
}
,则会使用默认样式。因此,设置null
。
不应显示组标题的NoGroupHeaderStyle
样式:
GroupItem
带标题的<Style TargetType="{x:Type GroupItem}" x:Key="NoGroupHeaderStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<ItemsPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
的默认样式。这是可选的。
GroupItem
上面描述的样式选择器:
<Style TargetType="{x:Type GroupItem}" x:Key="DefaultGroupHeaderStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ContentPresenter Grid.Row="0" />
<ItemsPresenter Grid.Row="1" Margin="20,0,0,0" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
由于样式选择器提供的自定义样式<local:GroupStyleSelector x:Key="GroupStyleSelector"
NoGroupHeaderStyle="{StaticResource NoGroupHeaderStyle}"
DefaultGroupStyle="{StaticResource DefaultGroupHeaderStyle}" />
,对于GroupItem
为SubCategory
的{{1}}项目,不显示组标题:
null
要先显示空<ListBox ItemsSource="{Binding GroupedItems}" DisplayMemberPath="ComponentName">
<ListBox.GroupStyle>
<GroupStyle ContainerStyleSelector="{StaticResource GroupStyleSelector}">
<GroupStyle.HeaderTemplate>
<DataTemplate>
<!-- Display the name of CollectionViewGroup -->
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
</ListBox>
的项目,应按SubCategory
排序:
SubCategory
以下类用作集合中的元素:
CollectionView.SortDescriptions.Add(
new SortDescription(nameof(Component.SubCategory),
ListSortDirection.Ascending));