style modern for wpf .net-3.5 styles

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



wpf templates free (2)

Tengo un ListView que quiero agrupar los resultados, sin embargo, los ejemplos que estoy encontrando no funcionan. ¿Cómo puedo agrupar mis resultados?

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); }


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>


GroupStyle.HeaderTemplate una cosa de inmediato: 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.