2010-11-01 17 views
2

Dans mon application WPF, j'ai une CollectionViewSource qui fournit une vue à un ObservableCollection privé. Le CollectionViewSource a un PropertyGroupDescription qui est utilisé dans un ListBox pour présenter des données à la préférence de l'utilisateur.CollectionViewSource + PropertyGroupDescription - nombre d'éléments dans un groupe

En utilisant un ControlTemplate contenant un contrôle Expander dans le ListBox GroupStyle, le résultat est plutôt sympa. Cependant, j'aimerais montrer le nombre d'éléments de chaque groupe dans l'en-tête Expander en plus du nom du groupe. Des idées sur le chemin de liaison?

Cordialement, Liam

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

Répondre

8

vous devez utiliser la propriété 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 [email protected]}" /> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </ScrollViewer> 
    </DockPanel> 
</Window> 
+0

Je n'ai aucune idée de ce que j'ai manqué dans les documents MSDN. Merci beaucoup. – LiamV

2

Je mis à jour le style du groupe comme suit. J'ai trouvé que je ne pouvais pas utiliser MultiBinding dans la propriété Expander.Header, rien n'était affiché à l'écran, j'avais besoin d'inclure un TextBlock intermédiaire à la place.

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