我想将多个类型的集合绑定到在画布中显示的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,则它可以工作。但是,由于我需要多个DataTemplates(每种类型一个),因此这不是解决方案。

这里有什么问题?为什么资源中的DataTemplates不起作用?

任何想法表示赞赏:)

最佳答案

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

<DataTemplate DataType="self:CalibrationRectangle">




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


MSDN


  要引用类的类型名称,请使用x:Type标记扩展。如果模板用于XML数据,则此属性包含XML元素名称。

关于c# - ItemsControl忽略资源中的DataTemplates,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30047373/

10-13 08:31