ItemsControl 忽略资源中的 DataTemplates

ItemsControl ignores DataTemplates in Resources

我想将多种类型的集合绑定到 canvas 中显示的 ItemsControl。到目前为止我的代码如下:

<ItemsControl ItemsSource="{Binding Path=Objects}">
     <ItemsControl.Resources>
         <DataTemplate DataType="self:CalibrationRectangle">
             <Rectangle Fill="{Binding Path=Color, Converter={StaticResource ColorToBrushConverter}}" Width="{Binding Width}" Height="{Binding Height}" />
         </DataTemplate>
         <DataTemplate DataType="self:PolygonVM">
             <Polygon Fill="{Binding Path=Color, Converter={StaticResource ColorToBrushConverter}}" Points="{Binding Points}" />
         </DataTemplate>
     </ItemsControl.Resources>
     <ItemsControl.ItemsPanel>
         <ItemsPanelTemplate>
             <Canvas Background="Red" />
         </ItemsPanelTemplate>
     </ItemsControl.ItemsPanel>
     <!--<ItemsControl.ItemTemplate>
         <DataTemplate DataType="self:CalibrationRectangle">
             <Rectangle Fill="{Binding Path=Color, Converter={StaticResource ColorToBrushConverter}}" Width="{Binding Width}" Height="{Binding Height}" />
         </DataTemplate>
     </ItemsControl.ItemTemplate>-->
     <ItemsControl.ItemContainerStyle>
         <Style>
             <Setter Property="Canvas.Top" Value="{Binding Path=Y}" />
             <Setter Property="Canvas.Left" Value="{Binding Path=X}" />
         </Style>
     </ItemsControl.ItemContainerStyle>
</ItemsControl>

在这种代码状态下,资源中的 DataTemplates 被完全忽略,而是将对象表示为字符串。 相反,如果我使用注释掉的行并在 ItemsControl.ItemsTemplate 中定义 DataTemplate,它就可以工作。但是,因为我需要多个数据模板(每种类型一个),所以这不是解决方案。

这里有什么问题?为什么资源中的数据模板不起作用?

欢迎任何想法:)

目前您定位 XML 元素名称。如果要定位类型,则需要使用 {x:Type ...} 并替换

<DataTemplate DataType="self:CalibrationRectangle">

<DataTemplate DataType="{x:Type self:CalibrationRectangle}">

来自MSDN

To refer to the type name of the class, use the x:Type Markup Extension. If the template is intended for XML data, this property contains the XML element name.