CollectionViewSource + PropertyGroupDescription - количество элементов в группе - PullRequest
3 голосов
/ 01 ноября 2010

В моем приложении WPF у меня есть CollectionViewSource, который предоставляет представление для частной коллекции ObservableCollection.CollectionViewSource имеет PropertyGroupDescription, который используется в ListBox для представления данных по выбору пользователя.

Используя ControlTemplate, содержащий элемент управления Expander в ListBox GroupStyle, результат довольно приятный.Однако я хотел бы показать количество элементов в каждой группе в заголовке расширителя в дополнение к имени группы.Любые идеи на пути связывания?

С уважением, Лиам

<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>

Ответы [ 2 ]

8 голосов
/ 01 ноября 2010

Вы должны использовать свойство 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>
3 голосов
/ 01 ноября 2010

Я обновил стиль группы следующим образом. Я обнаружил, что не могу использовать MultiBinding в свойстве Expander.Header, на экране ничего не отображается, вместо этого мне нужно было включить промежуточный 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>
...