TIP: Pozor na automatickou šířku DataGridu


Nedávno jsem si všiml zajímavého chování ve WPF, které mě velmi překvapilo a proto se o něj chci tímto způsobem podělit. Pokud by k tomu někdo věděl něco bližšího, jaký je důvod tohoto chování atd., tak ať prosím píše do komentářů…

Problém

Začnu rovnou tím, že ukážu XAML kód:

<Window x:Class="Blog.DataGridAutoWidth.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="600"a
        Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <DataGrid ItemsSource="{Binding People}"
                  Margin="5"
                  AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Jméno"
                                    Binding="{Binding FirstName}" />
                <DataGridTextColumn Header="Jméno"
                                    Binding="{Binding LastName}" />
            </DataGrid.Columns>
        </DataGrid>
        <TextBlock Text="Detail"
                   Grid.Column="1"
                   VerticalAlignment="Center"
                   HorizontalAlignment="Center"
                   FontSize="72"
                   FontWeight="Bold" />
        <TextBlock Text="Patička"
                   Grid.Row="2"
                   Grid.ColumnSpan="2"
                   HorizontalAlignment="Center" />
    </Grid>
</Window>

Tento kód přesně vystihuje to, co jsem chtěl. DataGrid bude mít nejmenší možnou šířku tak, aby na detail zbylo pokud možno co nejvíce místa…

Když je v kolekci People pouze pár objektů, je vše v pořádku. Když jich tam je o trošku více – např. 10000 (ale problém nastává už u mnohem nižšího počtu objektů…), tak aplikace zamrzne a okno se zobrazí až za několik desítek vteřin (opět záleží na počtu objektů).

Objekt v kolekci je úplně jednoduchý objekt se dvěma string vlastnostmi.

Řešení 1 – nastavení šířky sloupci

Problém se dá vyřešit tím, že se sloupci, který DataGrid obsahuje, nastaví pevná šířka, např. 200. V tu chvíli se okno otevírá okamžitě! Samozřejmě při stejném počtu dat, změna z Auto na 200 je to jediné, co jsem provedl.

Řešení 2 – nastavení šířky DataGridu – NEFUNGUJE!!

Pokud nastavím šířku 200 DataGridu, tak se problém neřeší. Což mě docela překvapilo.

Řešení 3 – změna patičky

V okně je patička, což je v tomto příkladu obyčejný TextBlock, který je úplně dole a je přes oba sloupce Gridu. Tento TextBlock stačí odstranit, nebo ještě lépe mu jen nastavit, aby nebyl přes oba sloupce (Grid.ColumnSpan=”1”) a vše opět funguje bez problémů.

Závěr

Závěr z toho plyne jediný – pozor na automatickou šířku DataGridu! Zkoušel jsem například ListBox a vše bylo v pořádku, takže nevím, jestli je problém i u jiných objektů…

Pokud by měl někdo nějaké vysvětlení k tomuto chování, budu rád. Všechna tři “řešení” popsaná výše mě docela překvapují. Pokud funguje Řešení 1, které celkem překvapivé není, tak proč nefunguje Řešení 2?! A co s tím má společného ta patička v posledním řádku? V pravém sloupci je obsah i bez patičky, tak proč to má tento vliv?!

Tento článek jsem zařadil do kategorie Tip, protože chci upozornit na možné problémy s automatickou šířkou. Jinak by vhodnější umístění bylo do kategorie Nezodpovězené otázky…

, , , ,

Komentáře jsou uzavřeny.