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.
enter image description here

Author: Santhosh, 2017-06-21

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>
 0
Author: Jacek, 2017-06-21 15:36:52