8

我们正在编写一个非常专业ItemsControl的,实际上ContentPresenter每行有三个 ',每个绑定到不同的对象(想想穷人的网格),而不是更常见的对象,比如ListBox.

现在,ListBox如果您没有明确指定 anItemTemplate或 an ItemTemplateSelector,则似乎有一些内部选择器纯粹基于数据类型应用模板。但是,我们ContentPresenter的 's 并没有接他们。我们也尝试将它们切换为ContentControl's,但这也没有奏效。

现在我知道我可以简单地编写我自己的DataTypeTemplateSelector来执行此操作,但我想知道该功能是否已经“烘焙”在某个被认为与这么多ItemsControl's ( ListBox, TreeView, ComboBox' DataGrid, 等) 一起使用的地方并且根据这个 MSDN文章...

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无论出于什么疯狂的原因,都是类型ObjectDataTemplates因此string除非您使用x:Type.


编辑:该属性是一个对象有一个很好的理由,因为那些能够(并且确实)阅读的人显然处于优势:

如果模板用于对象数据,则此属性包含数据对象的类型名称(作为字符串)。要引用类的类型名称,请使用 x:Type 标记扩展。如果模板用于 XML 数据,则此属性包含 XML 元素名称。有关为 XML 元素指定非默认命名空间的详细信息,请参阅文档备注。

于 2011-09-27T19:51:06.470 回答