2009-03-12 23 views
22

Tengo un ListView en el que quiero agrupar los resultados, sin embargo, los ejemplos que encuentro no funcionan. ¿Cómo puedo agrupar mis resultados?Cómo puedo agrupar elementos en un WPF ListView

Quiero agrupar en la propiedad Status 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); 
} 

Respuesta

23

noto una cosa de inmediato - la GroupStyle.HeaderTemplate se aplicará a un CollectionViewGroup, por lo que su DataTemplate probablemente debería tener este aspecto:

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

CollectionViewGroup.Name se le asignará el valor de Status para ese grupo.

+0

Bien, estoy recibiendo tres instancias del grupo ahora ahora, pero su agrupación por lo que es una victoria. Tu ser mi héroe personal aquí. – Russ

+0

¿Cómo puedo usar este código en un entorno MVVM? No hay una línea de código cercana donde se establecen los elementos de la lista. Se usan a través de encuadernación. No puedo encontrar un evento en el que pueda enganchar el método AddGrouping(). Cuando el DataContext de todo el control de usuario ha cambiado, ItemsSource de la lista sigue siendo nulo. Supongo que tarda un poco más. – ygoe

+0

Puede crear un [CollectionViewSource] (http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.aspx) en XAML con la agrupación adecuada y vincular los controles a ese en lugar de la colección fuente directamente –

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