Como agrupar os dados no DataGrid do WPF
Na minha aplicação WPF estou a ter datagrid neste datagrid quero agrupar dados de base de dados com base no nome da coluna chamado "Cidade", não estou a usar a arquitectura e o método da lista mvvm, estou a usar a vista ICollection e passei o objecto datável como parâmetro, este é o meu código C#
ICollectionView cv = CollectionViewSource.GetDefaultView(dt);
cv.GroupDescriptions.Add(newPropertyGroupDescription("City"));
Hotels.ItemsSource = cv;
e este é o meu código XAML:
<Window.Resources>
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<StackPanel>
<TextBlock Text="{Binding City}" Name="grouping" Foreground="Black"></TextBlock>
<ItemsPresenter/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<DataGrid Background="Azure" ItemsSource="{Binding Hotels}" CanUserAddRows="False" Name="Hotels" Style="{StaticResource AzureDataGrid}" Margin="0,173,0,0">
<DataGrid.GroupStyle>
<GroupStyle ContainerStyle="{StaticResource ResourceKey=GroupHeaderStyle}">
<GroupStyle.Panel>
<ItemsPanelTemplate>
<DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</DataGrid.GroupStyle>
</DataGrid>
não mostra texto no bloco de texto. estou a ligar o bloco de texto com o nome da coluna, mas não funciona...Por favor, ajuda-me.
1 answers
Editado:
Se não usar o modelo de visualização para cada item, mas o objecto da linha DataTable, o WPF não consegue reconhecer o nome "cidade". Você precisa usar o nome do grupo que é mantido por CollectionViewGroupInternal.Name
propriedade do objeto que representa um item do grupo. Neste cenário particular é o nome da cidade. Basta ligar Name
ao seu bloco de texto.
Você pode atingir o seu objectivo em menos linhas de código usando o cabeçote do grupo. O ItemPresenter por omissão estará visível por baixo do cabeçalho.
<!-- resources -->
<CollectionViewSource x:Key="devicesCollection" IsLiveSortingRequested="True" IsLiveGroupingRequested="True" Source="{Binding MyCollection}">
<!-- Sorting -->
<CollectionViewSource.SortDescriptions>
<componentModel:SortDescription PropertyName="Id" />
</CollectionViewSource.SortDescriptions>
<!-- Grouping -->
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="City"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<DataTemplate x:Key="GroupingHeader">
<Border Background="Gray">
<TextBlock Margin="10 5 5 5" FontSize="12" FontWeight="Bold" Text="{Binding Name}"/>
</Border>
</DataTemplate>
<!-- data grid -->
<DataGrid ItemsSource="{Binding Source={StaticResource ResourceKey=devicesCollection}, Mode=OneWay}">
<DataGrid.GroupStyle>
<GroupStyle HeaderTemplate="{StaticResource ResourceKey=GroupingHeader}" />
</DataGrid.GroupStyle>
</DataGrid>