2009-03-24 10 views
4

他のコントロールを含むことができ、依存プロパティを使用して構成可能なカスタムパネル(MyCustomControl)を作成しました。別のユーザーコントロール(MyUserControl)内では、XAMLでMyCustomControlのインスタンスが複数設定されています。ListControlのItemsSourceとして<UIElement>を使用すると、DataTemplateは適用されません。

ユーザーコントロールの外で、実行時にMyUserControlに存在するMyCustomControlsのリストにItemsControl(myItemsControl)をバインドしようとしています。したがって、私はMyUserControlから依存関係プロパティを通じてListを公開しています。

この戦略から予期しない動作が発生しています。私はItemsControlがListを受け取り、ItemsControlのDataTemplateを満たすことができるデータ値を持つオブジェクトとして内部の各コントロールインスタンスを使用したいと思います。しかし、それはやっていません。代わりに、基本的にDataTemplateを完全に無視し、リスト/ ItemsSourceにあるすべてのコントロールを再描画します。

要約すると、ItemsControlのItemsSourceとしてコントロールのリストを使用すると、コントロールをデータオブジェクトとして使用せず、代わりにコントロールインスタンスとしてレンダリングします。

驚いたことに、私は同じことをやろうとしますが、ItemsControlの代わりにListBoxを使用すると、データバインディングは期待通りに機能します。私は他の理由でListBoxを使用したくありません。誰もがこの動作に影響を与えるListBoxとItemsControlの間の違いを知っていますか?

編集:私はここにいない上場解像度と同じ問題を持ったという別のユーザー見つけました:ItemsControlにコードを調べるためにリフレクターを使用した後msdn social forum post

+0

この質問に対する回答を見る(http://stackoverflow.com/questions/661831/wpf-itemtemplate-not-acting-as-expected) – Arcturus

答えて

5

を項目がUIElementのであれば、IsItemItsOwnContainerOverrideメソッドはtrueを返します。あなたはそのクラスの代わりのItemsControlを使用している場合は、それが期待どおりに動作しますが、リストボックスの不要な機能を持っていません

protected override bool IsItemItsOwnContainerOverride(object item) 
{ 
    return (item is ContentPresenter); 
} 

:あなたはItemsControlにのサブクラスを作成し、この方法を変更することができます。

+0

ありがとう、これはうまくいきました!私はわずかにメソッド定義を変更する必要がありました... protected override bool IsItemItsOwnContainerOverride(オブジェクトアイテム) – YeahStu

関連する問題