Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DataGrid sorting doesn't work

I have a TabControl that has one TabItemwith a DataGrid inside.

<TabControl Background="{DynamicResource StandardBackgroundColor}" 
            Grid.Row="2" Grid.Column="1"
            BorderBrush="{DynamicResource StandardBorderColor}" 
            DataContext="{Binding ChartViewModel}">


<TabItem Header="{lex:Loc Data}">
           <DataGrid Name="TagGrid" ItemsSource="{Binding UnionAllSerie}" 
                     ColumnWidth="*" Background="#CCCCCC">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
                        <DataGridTextColumn Header="{lex:Loc time}" SortDirection="Descending"
                                            Binding="{Binding X, Converter={StaticResource OleDateToDateTimeConverter}, StringFormat=\{0:dd/MM/yy HH:mm\}}" />
                        <DataGridTextColumn Header="{lex:Loc Measure}"
                                            Binding="{Binding Y}" />
                    </DataGrid.Columns>
            </DataGrid>
</TabItem>

Where my UnionAllSerie is declared as follow:

public ObservableCollection<Data> UnionAllSerie { get; set; } = new ObservableCollection<Data>();

This collection of data is populated depending on the action performed on the window. What I want is to have the Grid automatically sorted by the second column, which represents the date.

Does anybody know what I am doing wrong or missing? Thanks!

like image 360
ctt_it Avatar asked Nov 25 '25 08:11

ctt_it


1 Answers

Setting the SortDirection on a Datagrid column does not actually sort the column. (see here for details).

I would recommend using a CollectionViewSource which has build in functionality for your purpose. The result should look something like this:

<Window.Resources>
    <CollectionViewSource x:Key="UnionAllSerieViewSource" Source="{Binding UnionAllSerie}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="X" Direction="Descending"/>
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
</Window.Resources>
...
<DataGrid Name="TagGrid" ItemsSource=""{Binding Source={StaticResource UnionAllSerieViewSource}}"" 
                 ColumnWidth="*" Background="#CCCCCC">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
                <DataGridTextColumn Header="{lex:Loc time}" SortDirection="Descending"
                                    Binding="{Binding X, Converter={StaticResource OleDateToDateTimeConverter}, StringFormat=\{0:dd/MM/yy HH:mm\}}" />
                    <DataGridTextColumn Header="{lex:Loc Measure}"
                                    Binding="{Binding Y}" />
            </DataGrid.Columns>
</DataGrid>

For more information on how to sort CollectionViewSources see this msdn article.

like image 185
vkluge Avatar answered Nov 27 '25 22:11

vkluge



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!