2011-07-31 28 views
0

好吧,我想我在這裏做得不對。異常,而試圖手動排序PagedCollectionView

我使用的是PagedCollectionView映射到一個自定義類型的的ObservableCollection。我希望能夠在用戶嘗試對DataGrid列進行排序時手動對基礎集合進行排序。

我做了以下內容:

obs = new ObservableCollection<Seats>(arrSeats); 
    view = new PagedCollectionView(obs); 

    INotifyCollectionChanged sortchangeNotifier = view.SortDescriptions as INotifyCollectionChanged; 
    sortchangeNotifier.CollectionChanged += new NotifyCollectionChangedEventHandler(sortchangeNotifier_CollectionChanged); 
    grdData.ItemsSource = view; 

    void sortchangeNotifier_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     // What to do here? 
    } 

事件處理程序只要單擊列標題被正確調用。但是,每當我嘗試修改ObservableCollection時,我都會得到以下例外情況:

刷新被延遲時,無法更改或檢查PagedCollectionView的內容或當前位置。

我希望能夠實現自己的自定義排序算法。有任何想法嗎?

謝謝!

編輯

那麼,這是特別瘋狂,但是當我在事件處理方法的try/catch塊纏上了我的密碼,更改將實際應用。有任何想法嗎 :) ?

回答

1

你真的想解決是有一個PagedCollectionView的自定義排序的問題 -

「我使用映射到一個自定義類型的一個ObservableCollection一個PagedCollectionView我希望能夠手動排序底層集合每當用戶嘗試對DataGrid列進行排序時。「

定製/擴展PagedCollectionView是做到這一點的方式。當我有需要做同樣的我創建的IComparer

的字典
public Dictionary<string, IComparer<object>> CustomSortFunctions 
    { 
     get 
     { 
      if (this.customSortFunctions == null) 
      { 
       this.customSortFunctions = new Dictionary<string, IComparer<object>>(); 
      } 
      return this.customSortFunctions; 
     } 
    } 

使得每對的關鍵是爲了對應一個DataGridColumn.SortMemberPath。對於您希望自定義排序的任何列,請添加一個合適的值對。

要利用此字典,請修改PagedCollectionView的SortList方法以檢查自定義比較器以排序(然後按適用方向排序)。例如:

if (this.CustomSortFunctions.ContainsKey(description.PropertyName)) 
{ 
    source = source.OrderBy(a => a, this.CustomSortFunctions[description.PropertyName]); 
} 

當用戶對數據網格進行「排序」時,將會發生所需的排序。

您的出發點是PagedCollectionView--其源代碼包含在Silverlight Toolkit的源代碼中(在Toolkit/Systems.Windows.Data/PagedCollection中)。

0

嘛的CollectionView和的ObservableCollection齊頭並進任何更改通知。因此,對兩個變更通知同時進行的任何更改都會導致異常。

我們將不得不採取這種不同的方法。

  1. 對於WPF - 使用DataGrid.Sorting事件調用並在其事件處理函數中執行e.Handled = true。這會停止datagrid的本地排序。在e.Handled = true之前,按照自己的喜好進行自定義排序。

  2. 爲Silverlight - 使用Dispatcher.BeginInvoke()和delgate您的自定義任務排序那裏。使用後臺調度程序優先級。

讓我知道如果這些幫助。

+0

silverlight網格沒有排序事件。 – SiN