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

时间:2011-09-27 19:15:40

标签: wpf datatemplate contentcontrol contentpresenter datatemplateselector

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

现在使用ListBox如果您没有明确指定ItemTemplateItemTemplateSelector,则似乎有一些内部选择器仅根据数据类型应用模板。但是,我们的ContentPresenter并未将其提升。我们也尝试将它们转换为ContentControl,但这也没有用。

现在我知道我可以简单地编写我自己的DataTypeTemplateSelector这样做了,但是我想知道这个功能是否已经被“烘焙”在某个地方被认为是用于那么多ItemsControl的( ListBoxTreeViewComboBox',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}" 

所以...有人想为什么不刺?

1 个答案:

答案 0 :(得分:7)

DataType出于任何疯狂的原因,属于Object类型,DataTemplates因此在该属性中设置了string,除非您使用x:Type


编辑:有一个很好的理由让该属性成为一个对象,因为那些能够(和做)读取的人显然是有利的:

  

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