CollectionViewSource+PropertyGroupDescription - 组中的项目数
Posted
技术标签:
【中文标题】CollectionViewSource+PropertyGroupDescription - 组中的项目数【英文标题】:CollectionViewSource+PropertyGroupDescription - count of items in a group 【发布时间】:2011-05-03 08:44:13 【问题描述】:在我的 WPF 应用程序中,我有一个 CollectionViewSource,它为私有 ObservableCollection 提供视图。 CollectionViewSource 有一个 PropertyGroupDescription,它在 ListBox 中用于将数据呈现给用户的偏好。
在 ListBox GroupStyle 中使用包含 Expander Control 的 ControlTemplate,结果非常好。但是,除了组名之外,我还想在扩展器标题中显示每个组中的项目数。关于绑定路径的任何想法?
问候, 利亚姆
<Style x:Key="basicGroupStyle" TargetType="x:Type GroupItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type GroupItem">
<Expander Header="Binding Name" IsExpanded="True">
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ListBox ItemsSource="Binding Source=StaticResource myViewSource">
<ListBox.GroupStyle>
<GroupStyle ContainerStyle="StaticResource basicGroupStyle"/>
</ListBox.GroupStyle>
</ListBox>
【问题讨论】:
【参考方案1】:你必须使用属性 ItemCount
<Window x:Class="WpfApplication11.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<XmlDataProvider x:Key="data">
<x:XData>
<Animals xmlns="">
<Animal name="Dory" Species="Fish" />
<Animal name="Felix" Species="Cat" />
<Animal name="Fluffy" Species="Dog" />
<Animal name="Jake" Species="Snake" />
<Animal name="Mittens" Species="Cat" />
<Animal name="Murtle" Species="Turtle" />
<Animal name="Nemo" Species="Fish" />
<Animal name="Rex" Species="Dog" />
<Animal name="Rover" Species="Dog" />
<Animal name="Toonces" Species="Cat" />
</Animals>
</x:XData>
</XmlDataProvider>
<CollectionViewSource x:Key="animalsBySpecies" Source="Binding Source=StaticResource data, XPath=Animals/Animal">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="@Species" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
<DockPanel>
<ScrollViewer DockPanel.Dock="Bottom" VerticalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="Binding Source=StaticResource animalsBySpecies">
<ItemsControl.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="x:Type GroupItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type GroupItem">
<GroupBox >
<GroupBox.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Text ="Binding Name" ></TextBlock>
<TextBlock Text="(" Grid.Column="1" Margin="15,0,0,0"></TextBlock>
<TextBlock Text="Binding ItemCount" Grid.Column="1" Margin="20,0,0,0"
HorizontalAlignment="Right" ></TextBlock>
<TextBlock Text=")" Margin="0,0,-5,0" Grid.Column="1
HorizontalAlignment="Right" ></TextBlock>
</Grid>
</GroupBox.Header>
<ItemsPresenter />
</GroupBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ItemsControl.GroupStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="Binding XPath=@name" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</DockPanel>
</Window>
【讨论】:
我不知道我是如何在 MSDN 文档中错过的。非常感谢。【参考方案2】:我更新了组样式如下。我发现我无法在 Expander.Header 属性中使用 MultiBinding,屏幕上没有显示任何内容,我需要包含一个中间 TextBlock。
<Style x:Key="basicGroupStyle" TargetType="x:Type GroupItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type GroupItem">
<Expander IsExpanded="True">
<Expander.Header>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="0 (1)">
<Binding Path="Name"/>
<Binding Path="ItemCount"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Expander.Header>
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
【讨论】:
以上是关于CollectionViewSource+PropertyGroupDescription - 组中的项目数的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 CollectionViewSource.SortDescriptions 排序很慢?
CollectionViewSource,如何过滤数据?
[Wpf]在C#中添加 collectionViewSource