将不同的样式应用于ItemsControl

时间:2011-11-15 13:33:48

标签: c# wpf data-binding datatemplate itemscontrol

我使用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,但它只支持一种风格,而不支持多种风格。

谢谢!

1 个答案:

答案 0 :(得分:1)

ItemsControl中的每个项目都包含在<ContentPresenter>标记中,因此在您的实际DataItem上应用您的定位将无效。

您可以使用ItemContainerStyleContentPresenter标记上应用定位,而不是使用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