我使用CompositeCollection
来托管我要在ItemsControl
控件中显示的对象,我使用this解决方案为不同的对象实现不同的DataTemplates,但是我想在我的收藏中申请每种类型的不同风格。我怎样才能做到这一点?
这是我的代码:
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type mapNamespace:MapObject}">
<DataTemplate.Resources>
<Style TargetType="{x:Type ContentPresenter}">
<Setter Property="Canvas.Left" Value="{Binding MapObjLocation.X}" />
<Setter Property="Canvas.Top" Value="{Binding MapObjLocation.Y}" />
</Style>
</DataTemplate.Resources>
<Rectangle Fill="#00000000" Height="10" Width="10" Stroke="Red">
<Rectangle.ToolTip>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<TextBlock Text="X: "/>
<TextBlock Text="{Binding MapObjLocation.X}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Y: " />
<TextBlock Text="{Binding MapObjLocation.Y}" />
</StackPanel>
</StackPanel>
</Rectangle.ToolTip>
</Rectangle>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:ReferenceMapRectangle}">
<DataTemplate.Resources>
<Style TargetType="{x:Type ContentPresenter}">
<Setter Property="Canvas.Left" Value="{Binding X}" />
<Setter Property="Canvas.Top" Value="{Binding Y}" />
</Style>
</DataTemplate.Resources>
<Rectangle Height="{Binding Height, Mode=TwoWay}" Width="{Binding Width, Mode=TwoWay}" Stroke="White" StrokeThickness="6"
Canvas.Top="{Binding Y, Mode=TwoWay}" Canvas.Left="{Binding X, Mode=TwoWay}" >
</Rectangle>
</DataTemplate>
</ItemsControl.Resources>
运行它的实际结果是MapObjects将显示在Canvas
上的正确位置,但ReferenceMapRectangle
对象将在画布上的(0,0)中保持固定,并且永远不要移动(宽度/高度会更新)
有没有人知道为什么会发生这种情况?我尝试使用ItemsControl.ItemContainerStyle
,但它只支持一种风格,而不支持多种风格。
谢谢!
答案 0 :(得分:1)
ItemsControl
中的每个项目都包含在<ContentPresenter>
标记中,因此在您的实际DataItem上应用您的定位将无效。
您可以使用ItemContainerStyle
在ContentPresenter
标记上应用定位,而不是使用DataItem标记
例如,如果您将定位应用于DataItem
:
<Canvas>
<ContentPresenter>
<DataItem Canvas.Left="50" Canvas.Top="50" />
</ContentPresenter>
<ContentPresenter>
<DataItem Canvas.Left="100" Canvas.Top="50" />
</ContentPresenter>
<ContentPresenter>
<DataItem Canvas.Left="150" Canvas.Top="50" />
</ContentPresenter>
</Canvas>
如果您在ItemContainerStyle
:
<Canvas>
<ContentPresenter Canvas.Left="50" Canvas.Top="50">
<DataItem />
</ContentPresenter>
<ContentPresenter Canvas.Left="100" Canvas.Top="50">
<DataItem />
</ContentPresenter>
<ContentPresenter Canvas.Left="150" Canvas.Top="50">
<DataItem />
</ContentPresenter>
</Canvas>
有关其他示例,请参阅this blog entry of mine