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,如何过​​滤数据?

在 CollectionViewSource 上触发过滤器

[Wpf]在C#中添加 collectionViewSource

与 CollectionViewSource 绑定时,DesignTime 数据未显示在 Blend 中

当ObservableCollection发生变化时更新CollectionViewSource WP7