Применение различных стилей к ItemsControl - PullRequest
0 голосов
/ 15 ноября 2011

Я использую CompositeCollection для размещения объектов, которые я хочу отобразить в элементе управления ItemsControl, я использовал это решение для реализации с использованием различных 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>

Фактический результат выполнения этого состоит в том, что объекты MapObject будут отображаться в правильном месте на Canvas, но объект ReferenceMapRectangle останется фиксированным в (0,0) на холсте и никогда не будет двигаться ( ширина / высота обновляется, хотя)

Кто-нибудь знает, почему это может произойти? Я попытался использовать ItemsControl.ItemContainerStyle, но он поддерживает только один стиль, а не несколько стилей.

Спасибо!

1 Ответ

1 голос
/ 15 ноября 2011

Каждый элемент в 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>

См. мою запись в блоге для другого примера

...