¿Cómo puedo agrupar elementos en un WPF ListView?

votos
22

Tengo una en la ListViewque quiero agrupar los resultados, sin embargo, los ejemplos que encuentro no funcionan. ¿Cómo puedo agrupar mis resultados?

Quiero agrupar en la Statuspropiedad de un objeto personalizado.

Esto es lo que tengo:

<ListView IsSynchronizedWithCurrentItem=True
          ItemsSource={Binding}
          HorizontalContentAlignment=Stretch
          ScrollViewer.HorizontalScrollBarVisibility=Disabled
          Background=Transparent SelectionChanged=ListView_SelectionChanged
          Name=lstShelvedOrders>

        <ListView.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock FontWeight=Bold FontSize=15
                         Text={Binding Path=Status}/>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </ListView.GroupStyle>

        <ListView.ItemContainerStyle>
            <Style TargetType={x:Type ListViewItem}>
                <Setter Property=BorderThickness Value=1 />
                <Setter Property=Width Value=Auto />
                <Setter Property=FontSize Value=10.4  />               
            </Style>
        </ListView.ItemContainerStyle>

        <ListView.View>
            <GridView>
                <GridViewColumn DisplayMemberBinding={Binding Path=Number} Header=Shelve ID  />
                <GridViewColumn DisplayMemberBinding={Binding Path=Customer} Header=Customer />
                <GridViewColumn DisplayMemberBinding={Binding Path=PurchaseOrderNo} Header=PO Number />
                <GridViewColumn DisplayMemberBinding={Binding Path=SubmittedBy} Header=Shelved By  />
                <GridViewColumn DisplayMemberBinding={Binding Path=OrderDate, StringFormat=MMM dd\, yyyy} Header=Date  />
                <GridViewColumn DisplayMemberBinding={Binding Path=CustomerTerms.Description} Header=Order Terms  />
                <GridViewColumn DisplayMemberBinding={Binding Path=ShippingMethod.Description} Header=Shipping  />
                <GridViewColumn DisplayMemberBinding={Binding Path=TotalPrice, StringFormat=c} Header=Order Total  />
            </GridView>
        </ListView.View>
    </ListView>

Y este es el código que tengo:

 void ShelvedOrderList_DataContextChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
 {
     AddGrouping();
 }

 private void AddGrouping()
 {
     if ( lstShelvedOrders.ItemsSource == null)
     {
         return;
     }

     CollectionView myView = (CollectionView)CollectionViewSource.GetDefaultView(lstShelvedOrders.ItemsSource);
     PropertyGroupDescription groupDescription = new PropertyGroupDescription(Status);
     myView.GroupDescriptions.Add(groupDescription);
 }
Publicado el 12/03/2009 a las 19:05
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
23

Noto una cosa de inmediato: GroupStyle.HeaderTemplatese aplicará a a CollectionViewGroup, por lo DataTemplateque probablemente debería verse así:

<GroupStyle>
    <GroupStyle.HeaderTemplate>
        <DataTemplate>
            <TextBlock FontSize="15" FontWeight="Bold" Text="{Binding Name}"/>
        </DataTemplate>
    </GroupStyle.HeaderTemplate>
</GroupStyle>

CollectionViewGroup.Namese le asignará el valor de Statuspara ese grupo.

Respondida el 12/03/2009 a las 19:44
fuente por usuario

votos
3

Creo que esto también puede ser mejor, usando un GroupStyle con un nuevo ControlTemplate:

<ListView ItemsSource="{Binding Path=ContactsView}">
  <ListView.GroupStyle>
    <GroupStyle>
      <GroupStyle.ContainerStyle>
        <Style TargetType="{x:Type GroupItem}">
          <Setter Property="Template" Value="{StaticResource ContactsGroupItemTemplate}" />
        </Style>
      </GroupStyle.ContainerStyle>
    </GroupStyle>
  </ListView.GroupStyle>

...

<ControlTemplate TargetType="{x:Type GroupItem}" x:Key="ContactsGroupItemTemplate">
  <Expander IsExpanded="False">
    <Expander.Header>
      <DockPanel>
        <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="5,0,0,0" Width="100"/>
          <TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount}"/>
          <TextBlock FontWeight="Bold" Text=" Items"/>
      </DockPanel>
    </Expander.Header>
    <Expander.Content>
      <ItemsPresenter />
    </Expander.Content>
  </Expander>
</ControlTemplate>
Respondida el 01/09/2011 a las 14:07
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more