Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Datagrid列排序生成错误_C#_Wpf_Sorting_Exception_Datagrid - Fatal编程技术网

C# Datagrid列排序生成错误

C# Datagrid列排序生成错误,c#,wpf,sorting,exception,datagrid,C#,Wpf,Sorting,Exception,Datagrid,我有一个datagrid列,它的列值是数据绑定的。我已经使用了DataGridTemplateColumn,我需要在此列中使用排序 my:DataGridTemplateColumn SortMemberPath="FileName" Header="Name" IsReadOnly="True" MinWidth="150" 它可以对数据进行排序,但当我在排序后编辑数据时,我需要在列中重新生成数据 FileListingGrid.ItemsSource = listFiles1; 但这会生

我有一个datagrid列,它的列值是数据绑定的。我已经使用了DataGridTemplateColumn,我需要在此列中使用排序

my:DataGridTemplateColumn SortMemberPath="FileName" Header="Name" IsReadOnly="True" MinWidth="150"
它可以对数据进行排序,但当我在排序后编辑数据时,我需要在列中重新生成数据

FileListingGrid.ItemsSource = listFiles1;
但这会生成“'Sorting'在AddNew或EditItem事务处理期间是不允许的。”


当列数据未排序时,它可以正常工作,但每当我对数据排序并必须重新生成列数据时,它都会引发以下错误。

您可以使用CollectionViewSource并指定您的SortMemberPath(在您的示例中为“文件名”)作为SortDescription吗?

ListCollectiontView.AddNewItem(item)之后不要忘记
ListCollectiontView.CommitNew()此方法结束添加事务并保存挂起的新项目。与committedit()相同。

有两种方法可以解决此问题

1) 自定义排序前的CommitNew()和committedit()

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;
}
2) 另一种方法是将数据网格设为只读

<my:DataGrid x:Name="DataGrid"                             
IsReadOnly="True"
Sorting="DataGrid_Sorting">