我们正在编写一个非常专业的
ItemsControl
,每个“行”实际上有三个ContentPresenter
,分别绑定到不同的对象(考虑穷人的网格),而不是像ListBox
一样使用更常见的一个。
现在,如果您没有明确指定ItemTemplate
或ItemTemplateSelector
,则ListBox
似乎有一些内部选择器,根据数据类型纯粹应用模板。 但是,我们的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}"
那么...有人想尝试一下为什么不行吗?
DataTemplates
和ContentControls
,没有遇到任何问题。你能否发布实际代码而不是伪代码?如果将DataType设置为{x:Type local:SomeTypeA}
而不仅仅是"local:SomeTypeA"
,它是否有效? - Rachelx:Type
确实可以实现它...微软在其无限的智慧中认为一个名叫“DataType”的属性属于Object
类型,而不是System.Type
类型,所以与样式的'TargetType'不同,对于DataTemplate,您必须使用标记扩展。 - Mark A. Donohoe