8

ItemsControlのようなより一般的なオブジェクトではなく、それぞれが異なるオブジェクト (貧乏人ContentPresenterのグリッドを考えてください) にバインドされていますListBox

anまたは anを明示的に指定しListBoxない場合は、純粋にデータ型に基づいてテンプレートを適用する内部セレクターがあるようです。しかし、私たちの はそれらを拾っていません。また、代わりに に切り替えようとしましたが、それもうまくいきませんでした。ItemTemplateItemTemplateSelectorContentPresenterContentControl

今、私はこれを行う独自のものを簡単に書くことができることを知っていますが、DataTypeTemplateSelectorその機能がすでにどこかで「焼き付けられている」かどうか疑問に思っています。論文...ItemsControlListBoxTreeViewComboBoxDataGrid

http://msdn.microsoft.com/en-us/library/ms742521.aspx

...デフォルトで動作するはずです! しかし、繰り返しますが、そうではありません。

これが私たちの(疑似)コードです...

<UserControl.Resources>

    <!-- These all work when the relevant items are in a ListBox,
         but not with stand-alone ContentPresenters or ContentControls -->

    <DataTemplate DataType="local:SomeTypeA">
        <TextBlock Text="{Binding Converter={c:DataTypeNameConverter}}" Foreground="Blue" />
    </DataTemplate>

    <DataTemplate DataType="local::SomeTypeB">
        <TextBlock Text="{Binding Converter={c:DataTypeNameConverter}}" Foreground="Purple" />
    </DataTemplate>

    <DataTemplate DataType="local::SomeTypeC">
        <TextBlock Text="{Binding Converter={c:DataTypeNameConverter}}" Foreground="Purple" />
    </DataTemplate>

</UserControl.Resources>

<!-- These don't pick up the templates -->
<ContentControl Content="{Binding Field1}" />
<ContentPresenter Content="{Binding Field2}" />

<!-- This however does -->
<ListBox ItemsSource="{Binding AllItems}" 

では... 試してみたい人はいませんか?

4

1 に答える 1

8

DataTypeなんらかのクレイジーな理由で、はタイプObjectであるDataTemplatesため、stringを使用しない限り、そのプロパティにセットがありますx:Type


編集:プロパティがオブジェクトであるのには非常に正当な理由があります。常に読むことができる(そして読むことができる)人には明らかに利点があるからです。

テンプレートがオブジェクトデータを対象としている場合、このプロパティにはデータオブジェクトのタイプ名が(文字列として)含まれます。クラスの型名を参照するには、x:TypeMarkupExtensionを使用します。テンプレートがXMLデータを対象としている場合、このプロパティにはXML要素名が含まれます。XML要素にデフォルト以外の名前空間を指定する方法の詳細については、ドキュメントの注釈を参照してください。

于 2011-09-27T19:51:06.470 に答える