10

まあ、私は混乱しています。

ItemsSourceコントロールにタイプの依存関係プロパティがIEnumerableあり、ユーザーがコレクションをそれにバインドする場合、どのオブジェクトにありDependencyPropertyChangedEventArgs.NewValueますか?

私の知る限りCollectionView、コレクション用に暗黙的に作成されてargs.NewValueおり、タイプがであると期待していますICollectionView

このブログから:

ユーザーがWPFプロパティをデータのコレクションにバインドすると、WPFはコレクションをラップするビューを自動的に作成し、プロパティを生のコレクションではなくビューにバインドします。この動作は常に発生し、CollectionViewSourceとは無関係です。

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

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

4

1 に答える 1

4

たぶん、 CollectionViewの備考セクションからの次の抜粋があなたの質問に答えます:

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

または、CollectionViewSourceクラスを使用してExtensible Application Markup Language(XAML)でコレクションのビューを作成し、コントロールをそのビューにバインドすることもできます。CollectionViewSourceクラスは、CollectionViewクラスのXAML表現です。例については、「方法:XAMLのビューを使用してデータを並べ替えてグループ化する」を参照してください。

したがって、CollectionViewSourceに明示的にバインドしない場合、コレクションのバインドは常に元のコレクション(取得したものNewValue)に対して行われますが、コレクションへのアクセス(たとえば、インデックスによるアイテムの取得)は常にデフォルトのビューを介して行われます。したがって、「生のコレクションではなく、プロパティをビューにバインドする」というステートメントは正確には当てはまりません。

簡単なテストで、GetDefaultViewがバインドされたObservableCollectionのSystem.Windows.Data.ListCollectionViewを返すことがわかりました。

于 2012-12-19T10:16:56.293 に答える