Оберните что-нибудь вокруг каждого элемента в ItemsControl - PullRequest
4 голосов
/ 23 октября 2010

Допустим, у меня есть коллекция объектов разных классов.Каждый класс имеет свой UserControl DataTemplated в файле ресурсов.

Теперь я хочу использовать ItemsControl для отображения коллекции, но я хочу, чтобы Border или Expander вокруг каждого элемента.

Я ожидал бы что-то вродеэто работает:

<ItemsControl ItemsSource="{Binding MyObjects}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border BorderBrush="Black" BorderThickness="3">
                <ContentPresenter/>
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Но ContentPresenter, похоже, выбирает ItemTemplate, потому что я получаю переполнение стека.

Как получить DataTemplate каждого элемента внутри ItemTemplate?

1 Ответ

11 голосов
/ 23 октября 2010

Обычно вы можете подумать о том, чтобы сделать это путем создания шаблона элемента.Проблема в том, что "generic" ItemsControl использует ContentPresenter в качестве контейнера для элемента.Поэтому, даже если вы попытаетесь установить стиль с помощью ItemContainerStyle, вы обнаружите, что не можете предоставить шаблон, потому что ContentPresenter не поддерживает шаблонизацию элемента управления (он поддерживает шаблонизацию данных, но здесь не используется).

Дляиспользуйте временный контейнер, который вам придется извлечь из ItemsControl, как в этом примере .

Альтернативой может быть просто использование элемента управления ListBox.Затем вы можете просто предоставить собственный шаблон, установив шаблон ListBoxItem с помощью стиля.

Подробнее о контейнерах можно прочитать здесь .

(С вашим разрешением ядобавляю решение к вашему ответу, Гуге)

    <ListBox ItemsSource="{Binding MyObjects}" Grid.Column="1">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <Border BorderBrush="Black" BorderThickness="3">
                                <ContentPresenter/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>
...