【问题标题】:CollectionViewSource+PropertyGroupDescription - count of items in a groupCollectionViewSource+PropertyGroupDescription - 组中的项目数
【发布时间】: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>

【问题讨论】:

    标签: wpf grouping collectionviewsource


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 2023-01-04
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多