use*_*064 5 c# sorting wpf datagrid exception
我有一个datagrid列,其列值是数据绑定的。我已经使用了DataGridTemplateColumn,并且需要在此列中使用排序。
my:DataGridTemplateColumn SortMemberPath="FileName" Header="Name" IsReadOnly="True" MinWidth="150"
Run Code Online (Sandbox Code Playgroud)
它可以对数据进行排序,但是在排序后编辑数据时,我需要重新生成列中的数据。
FileListingGrid.ItemsSource = listFiles1;
Run Code Online (Sandbox Code Playgroud)
但这会生成“在AddNew或EditItem事务期间不允许'排序'。”
当不对列数据进行排序时,它工作正常,但是每当我对数据进行排序并必须重新生成列数据时,它就会引发以下错误。
有两种方法可以解决这个问题
1) 自定义排序前的 CommitNew() 和 CommitEdit()
private void DataGrid_ParametersList_Sorting(object sender, DataGridSortingEventArgs e)
{
DataGridColumn column = e.Column;
//prevent the built-in sort from sorting
e.Handled = true;
ListSortDirection direction = (column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending;
//set the sort order on the column
column.SortDirection = direction;
//use a ListCollectionView to do the sort.
ListCollectionView lcv = (ListCollectionView)CollectionViewSource.GetDefaultView(DataGrid_ParametersList.ItemsSource);
ParametersListComparer customComparer = new ParametersListComparer();
customComparer.SortDirection = direction;
customComparer.SortMemeberPath = column.SortMemberPath;
if (lcv.IsAddingNew)
lcv.CommitNew();
if (lcv.IsEditingItem)
lcv.CommitEdit();
//apply the sort
lcv.CustomSort = customComparer;
}
Run Code Online (Sandbox Code Playgroud)
2)另一种方法是使数据网格只读。
<my:DataGrid x:Name="DataGrid"
IsReadOnly="True"
Sorting="DataGrid_Sorting">
Run Code Online (Sandbox Code Playgroud)