Reprinted: http://www.kecq.com/artic-10322303.html
Data previously had a client, but is directly connected to the database, now that this is not a good way, then change the server RESTful API + client, the data are processed on the server side. Some of the problems encountered in the preparation process, because before did not use paging, the DataGrid will use the default sort on the line, but now needs a paging service side, we found some problems recorded.
There is a DataGrid named dataGrid1 in XAML, click on the column header to sort only need to add Sorting properties in the above
<DataGrid Grid.Row="2" x:Name="dataGrid1" AutoGenerateColumns="False" IsReadOnly="True" AlternationCount="2" Sorting="dataGrid1_Sorting" >
Initialization when you can specify a sort for a column
ICollectionView view = CollectionViewSource.GetDefaultView(list); view.SortDescriptions.Clear(); //先清除所有的排序 SortDescription sd = new SortDescription("列名", ListSortDirection.Descending); view.SortDescriptions.Add(sd);
You can also specify in XAML, assuming that the column name is movieName
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=movieName}" SortDirection="Ascending" SortMemberPath="movieName" Header="名称" />
</DataGrid.Columns>
Let's look at the main sorting method
Private void dataGrid1_Sorting ( Object SENDER, DataGridSortingEventArgs E) { e.Handled = to true ; // can not happen not to examine pager.OrderColumn = e.Column.SortMemberPath; an ICollectionView View = CollectionViewSource.GetDefaultView (dataGrid1.ItemsSource); pager .Order = " ASC " ; // default ascending IF (view.SortDescriptions.Count> 0 ) { IF (view.SortDescriptions [ 0 ] == .propertyName e.Column.SortMemberPath) { if (view.SortDescriptions[0].Direction == System.ComponentModel.ListSortDirection.Ascending) { pager.Order = "desc"; } else if (view.SortDescriptions[0].Direction == ListSortDirection.Descending) { pager.Order = "asc"; } } } LoadData(); }
e.Column.SortMemberPath to click on the column name column headers, the problem in e.Column.SortDirection this property, if the initialization when there is so designated first click when to get to, but then click on this property is null, and null is not specified, well, I'm here for its next assignment e.Column.SortDirection = ListSortDirection.Descending but when clicked it still is null somehow not found online. After long exploration, with another method
ICollectionView view = CollectionViewSource.GetDefaultView(dataGrid1.ItemsSource);
There can be obtained from view.SortDescriptions sort columns to determine which collection is greater than 0 and click on the column name is the current row, if the current is ascending to descending simultaneously query the data in descending order, of course, and finally had to perform cleanup ordering add sort
view.SortDescriptions.Clear (); // erase all sort SortDescription SD = new new SortDescription ( " Column Name " , ListSortDirection.Descending); view.SortDescriptions.Add (SD);
This realization of the server-side sorting, I do not know whether the easier way.
supplement:
The article mentions: I'm here for its assignment e.Column.SortDirection = ListSortDirection.Descending ,. Here the actual effect after re-bind the data will be lost before ordering. Rebinding state should sort the columns in the bound data before
So I deal with this here,
1, the rear end of the last record of the status of a column name sort ascending or descending order
2, after data binding, once again assigned the current sort state. Swich current sort is recorded before rebinding ordering data, sorting of a column state case, then gridResult2.Columns [2] .SortDirection reset state ordering value for this column. This will reset the ranking value acquired in DataGridSortingEventArgs e e.Column.SortDirection properties. Such re-assignment, but also to show the sort that comes with a small arrow. I do not understand you can contact www.kaishanguai.com or qq369628105
switch (CurrentOrderByEnum)
{
case (OrderByEnum.OrderByNameAsc):
gridResult2.Columns[2].SortDirection = ListSortDirection.Ascending;
break;
case (OrderByEnum.OrderByNameDesc):
gridResult2.Columns[2].SortDirection = ListSortDirection.Descending;
break;
}
Code:
<DataGrid x:Name="gridResult2" SelectionUnit="FullRow" MinHeight="420" EnableRowVirtualization ="False" GridLinesVisibility="None" BorderThickness="0" AlternationCount="2" ItemsSource="{Binding}" CanUserAddRows="False" HorizontalAlignment="Left" VerticalAlignment="Top" AutoGenerateColumns="False" Visibility="Hidden" IsReadOnly="True" SelectionMode="Extended" Sorting="GridResult2_OnSorting" MouseMove="GridResult2_OnMouseMove" MouseLeftButtonDown="GridResult2_OnMouseLeftButtonDown" MouseLeftButtonUp="GridResult2_OnMouseLeftButtonUp" MouseRightButtonUp="ImageGrid_OnMouseRightButtonDown" LoadingRow="GridResult2_OnLoadingRow" KeyDown="DataView_OnKeyDown" PreviewKeyDown="GridResult2_OnPreviewKeyDown"> <!--SelectionChanged="GridResult2_OnSelectionChanged" --> <!-- This is required to handle CTRL + C when something is selected in the DataGrid --> <DataGrid.CommandBindings> <CommandBinding Command="Copy" Executed="CopyCommand" /> </DataGrid.CommandBindings> <!-- This is required to handle CTRL + C when something is selected in the DataGrid --> <DataGrid.InputBindings> <KeyBinding Key="C" Modifiers="Control" Command="Copy" /> </DataGrid.InputBindings> <DataGrid.Columns> <DataGridTemplateColumn> <DataGridTemplateColumn.HeaderTemplate> <DataTemplate> <CheckBox Name="ChkAll" ToolTip="All" Content="All" IsChecked="False" Unchecked="UnAll_Checked" Checked="All_Checked"></CheckBox> </DataTemplate> </DataGridTemplateColumn.HeaderTemplate> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox Checked="ItemFile_OnChecked" Unchecked="ItemFile_OnUnchecked" Tag="{Binding FilePath}" HorizontalAlignment="Center" x:Name="itemFile" VerticalAlignment="Center" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header=""> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Image Source="{Binding SnapshotPath}" Height="20" Width="20" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="Name" Binding="{Binding FileName}" /> <DataGridTemplateColumn Header="MD5"> <DataGridTemplateColumn.HeaderStyle> <Style TargetType="DataGridColumnHeader"> <Setter Property="HorizontalContentAlignment" Value="Center"></Setter> </Style> </DataGridTemplateColumn.HeaderStyle> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock HorizontalAlignment="Center" Text="{Binding FileMD5}"></TextBlock> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Modified Date" CanUserSort="True" SortMemberPath="FileModifiedTime"> <DataGridTemplateColumn.HeaderStyle> <Style TargetType="DataGridColumnHeader"> <Setter Property="HorizontalContentAlignment" Value="Center"></Setter> </Style> </DataGridTemplateColumn.HeaderStyle> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock HorizontalAlignment="Center" Text="{Binding FileModifiedTime}"></TextBlock> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="Path" Binding="{Binding FilePathNoName}" /> <DataGridTemplateColumn Header="Classify Type" CanUserSort="True" SortMemberPath="ClassifyType"> <DataGridTemplateColumn.HeaderStyle> <Style TargetType="DataGridColumnHeader"> <Setter Property="HorizontalContentAlignment" Value="Center"></Setter> </Style> </DataGridTemplateColumn.HeaderStyle> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock HorizontalAlignment="Center" Text="{Binding ClassifyType}"></TextBlock> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Type"> <DataGridTemplateColumn.HeaderStyle> <Style TargetType="DataGridColumnHeader"> <Setter Property="HorizontalContentAlignment" Value="Center"></Setter> </Style> </DataGridTemplateColumn.HeaderStyle> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock HorizontalAlignment="Center" Text="{Binding FileExtension}"></TextBlock> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Size(KB)" CanUserSort="True" SortMemberPath="FileSize"> <DataGridTemplateColumn.HeaderStyle> <Style TargetType="DataGridColumnHeader"> <Setter Property="HorizontalContentAlignment" Value="Center"></Setter> </Style> </DataGridTemplateColumn.HeaderStyle> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock HorizontalAlignment="Center" Text="{Binding FileSize, StringFormat={}{0:N0}}"></TextBlock> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
// After the binding data, to re-set the sort state
gridResult2.ItemsSource = bindDataList; // set the sort icons IF (IsClickSort) { Switch (CurrentOrderByEnum) { Case (OrderByEnum.OrderByNameAsc): gridResult2.Columns [ 2 ] = .SortDirection ListSortDirection. Ascending; BREAK ; Case (OrderByEnum.OrderByNameDesc): gridResult2.Columns [ 2 ] = .SortDirection ListSortDirection.Descending; BREAK ; Case (OrderByEnum.OrderByModifiedDateAsc): gridResult2.Columns[4].SortDirection = ListSortDirection.Ascending ; break; case (OrderByEnum.OrderByModifiedDateDesc): gridResult2.Columns[4].SortDirection = ListSortDirection.Descending; break; case (OrderByEnum.OrderByClassifyAsc): gridResult2.Columns[6].SortDirection = ListSortDirection.Ascending; break; case (OrderByEnum.OrderByClassifyDesc): gridResult2.Columns[6].SortDirection = ListSortDirection.Descending ; break; case (OrderByEnum.OrderBySizeAsc): gridResult2.Columns[8].SortDirection = ListSortDirection.Ascending; break; case (OrderByEnum.OrderBySizeDesc): gridResult2.Columns[8].SortDirection = ListSortDirection.Descending; break; } } else { gridResult2.Columns[4].SortDirection = ListSortDirection.Descending; }
//排序事件
private void GridResult2_OnSorting(object sender, DataGridSortingEventArgs e) { ListSortDirection direction = (e.Column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending; bool sortAscending = direction == ListSortDirection.Ascending; switch (e.Column.SortMemberPath) { case ("FileName"): if (sortAscending) { CurrentOrderByEnum = OrderByEnum.OrderByNameAsc; } else { CurrentOrderByEnum = OrderByEnum.OrderByNameDesc; } break; case ("FileModifiedTime"): if (sortAscending) { CurrentOrderByEnum = OrderByEnum.OrderByModifiedDateAsc; } else { CurrentOrderByEnum = OrderByEnum.OrderByModifiedDateDesc; } break; case ("ClassifyType"): if (sortAscending) { CurrentOrderByEnum = OrderByEnum.OrderByClassifyAsc; } else { CurrentOrderByEnum = OrderByEnum.OrderByClassifyDesc; } break; case ("FileSize"): if (sortAscending) { CurrentOrderByEnum = OrderByEnum.OrderBySizeAsc; } else { CurrentOrderByEnum = OrderByEnum.OrderBySizeDesc; } break; } IsClickSort = true; Search(); }