Datagrid列排序生成错误

时间:2010-10-01 10:44:56

标签: c# wpf sorting exception datagrid

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

my:DataGridTemplateColumn SortMemberPath="FileName" Header="Name" IsReadOnly="True" MinWidth="150"

它可以对数据进行排序和排序,但是当我在排序后编辑数据时,我需要在列中重新生成数据。

FileListingGrid.ItemsSource = listFiles1;

但是这会在AddNew或EditItem事务期间生成“'Sorting'。”

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

3 个答案:

答案 0 :(得分:4)

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

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;
}

2)另一种方法是将数据网格设为只读。

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

答案 1 :(得分:2)

ListCollectiontView.AddNewItem( item );后不要忘记ListCollectiontView.CommitNew();此方法结束添加事务并保存待处理的新项目。 CommitEdit()

也是如此

答案 2 :(得分:0)

您可以使用CollectionViewSource并将SortMemberPath(在您的案例中为'FileName')指定为SortDescription吗?