2

私は WPF が初めてで、C# も完全には理解していないようです。
以下のコードは、ソートされたデータを DataGrid に提供することになっています。

これが私が理解するのに苦労しているコードです:

ObservableCollection<Person> PersonsCollection = new ObservableCollection<Person>();
//this one is easy: I create new collection for objects of class Person and I call it PersonsCollection  

ICollectionView PersonsView = CollectionViewSource.GetDefaultView(PersonsCollection);
//this one is more complicated. Does it mean that I create new object called PersonsView which I assume that implements ICollectionView interface?  

ListCollectionView personsView = PersonsView as ListCollectionView;  
//this one I do not understand. Why do we need it? How can we treat PersonsView as ListCollectionView?  

personsView.CustomSort = new PersonSorter();  
//here we assign object of PersonSorter class to do the sorting. Fine with me.  

dataGrid1.ItemsSource = personsView;
//and here we assign personsView as a ItemsSource for our DataGrid. Fine with me.

何か助けはありますか?ありがとうございました :-)

4

3 に答える 3

2

これは簡単です。クラス Person のオブジェクトの新しいコレクションを作成し、それを PersonsCollection と呼びます。

正解ですが、最初にいくつかのことをクリアしたかったのです。ここでは任意のコレクションを使用できます。より正確には、任意のIEnumberable.

ObservableCollection通常との違いIEnumerableは、最初のものはアイテムがコレクションに追加、削除、または再注文されたときに通知を発生させ、後者は通知を発生させないことです。

重要:注目すべきことの 1 つは、コレクションが であろうと であろうと、コレクションのタイプに関係なくIEnumberableObservableCollectionそのコレクションがバインディングで使用される場合、WPF システムはそのコレクション(ソース)の周りにラッパーを作成し、デフォルトビューのようなものです。

そのビューは を実装してICollectionViewいます。現在のアイテムの概念を保持し、並べ替え、ナビゲーション、フィルタリング、グループ化などの機能を提供します。

このビューはコレクション(ソース)に関連しているため、同じコレクションに複数のバインディングがある場合、それらのバインディングはすべて、実際には WPF システムによって作成された既定のビューにバインドされるため、既定のビューが更新されると一緒に更新されます。

この最後の重要なトピックは、今後の質問に関連しているため、クリアする必要がありました。

これはもっと複雑です。インターフェイスを実装していると思われる PersonsView という新しいオブジェクトを作成するということICollectionViewですか?

いいえ、または少なくとも完全に真実ではありません。WPF システムによって作成されるデフォルト ビューへの参照を取得しているため、そのオブジェクトを取得するメソッドが呼び出されGetDefaultView()CreateDefaultView().

これは私にはわかりません。なぜそれが必要なのですか?PersonsView を ListCollectionView として扱うにはどうすればよいでしょうか。

本当に必要ありません。この行はなくてもかまいません。PersonViewとして扱うことができListCollectionViewます

すべてのコレクションにはデフォルトの CollectionView があります。IList を実装するすべてのコレクションでは、ListCollectionView オブジェクトが既定のビュー オブジェクトです。

MSDN ドキュメント

残りの部分はあなたと私が大丈夫なので、コメントする必要はありません.

于 2013-08-31T22:25:10.937 に答える
2

これが私の理解です:

あなたの最初の行:

ObservableCollection<Person> PersonsCollection = new ObservableCollection<Person>();

あなたが正しく言うように、 の監視可能なコレクションを作成してPersonsいる場合、このコレクションに直接バインドすることができ (技術的には、デフォルトの にバインドすると考えられますCollectionView)、DataGridコレクションへの変更が通知され、それに応じて更新されます。ただし、データを並べ替える追加機能が必要です。

だから、あなたの2行目:

ICollectionView PersonsView = CollectionViewSource.GetDefaultView(PersonsCollection);

を使用してのデフォルトをGetDefaultView返します。aは既存のコレクションのラッパーであり、フィルタリング、グループ化、ナビゲーション、並べ替えなどの追加の動作を提供します。コレクションが WPF でバインドされる場合、バインドはオブジェクトに対するものであり、データの並べ替えや表示などの際に操作されるのはこれらのビューです。CollectionViewPersonsCollectionCollectionViewCollectionView

たまたま、CollectionViewSourceこの型の のデフォルトの型は ですListCollectionViewが、これは に渡すオブジェクトの型によって異なる可能性があるためCollectionViewSource.GetDefaultView()、メソッドはインターフェース を返しますICollectionView

したがって、この時点で、 をとして使用できますがICollectionView、 にあるを定義することにより、カスタムの並べ替え動作を定義したいと考えています。PersonsViewItemsSourceCustomSortListCollectionView

デフォルトのビューが であることがわかっているので、それに応じてオブジェクトListCollectionViewを明示的にキャストし(3 行目)、必要な並べ替え動作を設定できます (4 行目)。ICollectionView

ListCollectionView personsView = PersonsView as ListCollectionView;  

personsView.CustomSort = new PersonSorter();

より知識のあるユーザーが、私が犯した間違いを指摘してくれることを願っています。

于 2013-08-31T22:19:36.353 に答える
1

ObservableCollection を作成している ObservableCollection は、変更された DP 値である CollectionChanged イベントを発生させるために使用されます。
ICollectionView は、WPF データグリッドなどでコレクション データを表示するために使用される人物コレクションからビューを作成して
います。

 personsView.CustomSort = new PersonSorter();  // depending on which Tech you are using for example it might be you are creating the sorting property Name.
于 2013-08-31T21:27:35.090 に答える