如何根据数据类型启用自动DataTemplate选择,就像使用项目控件一样?

Mar*_*eIV 8 wpf datatemplate contentpresenter contentcontrol datatemplateselector

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

现在有一个ListBox如果你没有明确指定一个ItemTemplate或一个ItemTemplateSelector,似乎有一些内部选择器纯粹基于数据类型应用模板.但是,我们ContentPresenter不会接受它们.我们也尝试过将它们ContentControl改为,但这也没有用.

现在我知道我可以简单地写我自己DataTypeTemplateSelector做这个工作,但如果该功能已经"出炉中的"我不知道什么地方认为它有这么多使用ItemsControl的(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}" 
Run Code Online (Sandbox Code Playgroud)

那么......任何人都想为什么不刺?

H.B*_*.B. 7

DataType,无论什么疯狂的原因,都是类型Object,DataTemplates因此string除非你使用,否则在该属性中有一组x:Type.


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

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