2011-07-31 6 views
0

Ok私はここで何か間違っていると思います。手動でPagedCollectionViewを並べ替えるときに例外が発生する

私は、カスタムタイプののObservableCollectionにマッピングされPagedCollectionViewを使用しています。ユーザーが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を変更しようとすると、次の例外が発生します。

Refreshが延期されているときに、PagedCollectionViewの内容または現在の位置を変更または確認できません。

独自のカスタムソートアルゴリズムを実装できます。何か案は?

ありがとうございます!

EDIT

まあ、これは特にクレイジーですが、私は、イベントハンドラメソッドでtry/catchブロックで自分のコードをラップする場合、変更が実際に適用されます。何か案は :) ?

答えて

1

-

「私はカスタムタイプののObservableCollectionにマッピングされたPagedCollectionViewを使用しています、私は手動で基になるコレクションを並べ替えることができるようにしたいです。ユーザーがDataGrid列をソートしようとするたびに。

PagedCollectionViewのカスタマイズ/拡張は、これを行う方法です。私は同じことを行う必要があったとき、私はしたIComparer

各ペアのキーはDataGridColumn.SortMemberPathに対応することが意図されるように
public Dictionary<string, IComparer<object>> CustomSortFunctions 
    { 
     get 
     { 
      if (this.customSortFunctions == null) 
      { 
       this.customSortFunctions = new Dictionary<string, IComparer<object>>(); 
      } 
      return this.customSortFunctions; 
     } 
    } 

の辞書を作成しました。カスタム並べ替えが必要な列については、適切な値のペアを追加します。

この辞書を活用するには、PagedCollectionViewのSortListメソッドを変更して並べ替え、適用可能な方向に並べ替えるカスタム比較を確認します。例えば:

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

ユーザーがデータグリッドで「並べ替える」と、あなたが望む並べ替えが行われます。

出発点はPagedCollectionViewです。このソースはSilveright Toolkit(Toolkit/Systems.Windows.Data/PagedCollection内)のソースコード全体に含まれています。

0

まあ、CollectionViewとObservableCollectionは、通知の変更を手にしています。したがって、変更通知と同時に2つのいずれかに対して行われた変更によって例外が発生します。

これに対して、別のアプローチをとる必要があります。

  1. WPFの場合 - DataGrid.Sortingイベント呼び出しを使用し、イベントハンドラでe.Handled = trueを実行します。これは、DataGridのネイティブソートを停止します。 e.Handled = trueの前に、好きなようにカスタムソートを行います。

  2. Silverlightの場合 - Dispatcher.BeginInvoke()を使用して、そこにカスタムソートのタスクを追加する必要があります。バックグラウンドディスパッチャーの優先順位を使用します。

これらが役立つかどうか教えてください。あなたが本当に解決したい問題がPagedCollectionViewのカスタムの並べ替えを持っていた

+0

Silverlightグリッドにはソートイベントがありません。 – SiN

関連する問題