2010-10-01 54 views
3

我有一個datagrid列,其列值是數據綁定。我已經使用DataGridTemplateColumn,我需要在此列中使用排序。Datagrid列排序生成錯誤

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

它工作和排序的數據,但當我排序後編輯數據,我需要重新生成列中的數據。

FileListingGrid.ItemsSource = listFiles1; 

但這產生「‘排序’是不是一個AddNew或EditItem交易過程中允許。」

當列數據未排序它工作正常,但每當我對數據進行排序,並不得不重新 - 生成列數據,它會引發以下錯誤。

回答

0

你可以使用CollectionViewSource並指定SortMemberPath(在你的情況「文件名」)作爲SortDescription?

2

ListCollectiontView.AddNewItem(item);後不要忘記ListCollectiontView.CommitNew();這種方法結束添加事務並保存掛起的新項。同爲CommitEdit()

2

有兩種方法來解決這個問題

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">