2012-12-19 25 views
9

まあ、私は混乱しています。コレクションへのバインディングはどのように機能しますか?

私のコントロールにはItemsSourceIEnumerableタイプがあり、ユーザーがコレクションにバインドする場合、どのオブジェクトを持っていますかDependencyPropertyChangedEventArgs.NewValue

私が知る限り、CollectionViewは暗黙のうちにコレクションのために作成されており、args.NewValueICollectionViewであると予想しています。 this blogから

ユーザーはデータの収集、WPF は自動的に、コレクションをラップするビューを作成しし、ビューに プロパティをバインドし、ない生にWPFのプロパティをバインドしますコレクション。この動作は常に が発生し、CollectionViewSourceから独立しています。

しかし、デバッガ(VS 2012、.net v.4.0)は、NewValueに元の生のコレクションを受け取ったことを示しています。 (BindsDirectlyToSourceはデフォルトでは設定されておらずfalseに等しい)
これはどうやってできますか?

この場合、WPFコントロールがソート、グループ化、およびフィルタリングをどのようにサポートしているのか理解できません。
CollectionViewを注入して使用する方法と時期はいつですか?

答えて

4

たぶんCollectionViewで備考セクションから以下の抽出物は、あなたの質問に答える:WPFアプリケーションで

、すべてのコレクションは、関連するデフォルト コレクションビューを持っています。コレクションを直接操作するのではなく、 バインディングエンジンは、関連付けられた ビューを通じてコレクションに常にアクセスします。既定のビューを取得するには、 CollectionViewSource.GetDefaultViewメソッドを使用します。 に基づく内部クラスIEnumerableのみを実装するコレクションの既定のビューは、コレクションビューです。 ListCollectionViewは、IListを実装するコレクション の既定のビューです。 BindingListCollectionViewは、IBindingListViewまたはIBindingListを実装するコレクションのデフォルトビュー です。

また、CollectionViewSource クラスを使用してExtensible アプリケーションマークアップ言語(XAML)でコレクションのビューを作成し、コントロールをそのビューにバインドすることもできます。 CollectionViewSourceクラスは、CollectionViewクラスの のXAML表現です。例については、方法:データの並べ替えとグループ化を参照してください。 XAMLでのビューの使用あなたが明示的にCollectionViewSourceに結合しない場合

だから、バインディングのコレクションは常に(あなたがNewValueで得るもの)のオリジナルコレクションに行われますが、コレクションへのアクセスは、(例えばインデックスでアイテムを取得)ですデフォルト表示で常にが実行されます。したがって、ステートメントは「ビューを生きているコレクションではなくプロパティにバインドします」というステートメントは正確に真ではありません。

速いテストでは、GetDefaultViewが私のバインドされたObservableCollectionにSystem.Windows.Data.ListCollectionViewを返すことが明らかになりました。

+0

これは、コントロールが渡されたコレクションのCollectionViewを要求し、グループ化、フィルタリング、並べ替えをサポートしていないことを意味します。前述の機能を実装するのはコントロールの責任ですね。 –

+1

[CollectionViewSource](http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource)に明示的にバインドすると、グループ化、フィルタリング、並べ替えのための既定のサポートがあります。 .aspx)。 [コレクションへのバインド]の「ビューを作成する方法」を参照してください(http://msdn.microsoft.com/en-us/library/ms752347.aspx#binding_to_collections) – Clemens

+0

これははいと思われます。 GroupItemはItemsControl自体によって作成されています... –

関連する問題