Aquí podría ser tu PUBLICIDAD


¿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 Russ
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 07:44
fuente por usuario Robert Macnee


Aquí podría ser tu PUBLICIDAD


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 02:07
fuente por usuario MAXE