Шаблоны ListBox: как создать общий шаблон, но при этом изменить содержимое на основе элемента - PullRequest
0 голосов
/ 22 апреля 2011

Я уже некоторое время шаблонизирую ListBoxes в WPF, но мне было интересно, есть ли способ иметь шаблон для ListBoxItem, который бы применялся ко всем элементам в ListBox, но также имел ItemTemplateSelector для изменения содержимогоконтейнеров.

У меня есть список строк и изображений, и я хочу, чтобы они отображались однозначно, чтобы изображение отображалось с рамкой, а строки отображались в текстовом поле для редактирования.Я сделал ItemTemplateSelector и выбрал шаблон на основе типа.Однако я хочу добавить некоторые элементы управления, такие как кнопка для удаления и флажок для отображения выбора для обоих шаблонов.

Я знаю, что могу добавить оба объекта в оба шаблона для строк или изображений, но я хочу, чтобы он мог масштабироваться и не добавлялся при каждом добавлении шаблона.Есть мысли?

1 Ответ

1 голос
/ 23 апреля 2011

Вы можете использовать ItemContainerStyle для переопределения Template из ListBoxItems (вероятно, это не то, что я бы сделал).

В качестве альтернативы вы можете определить ItemTemplate, который обрамляет ваши шаблоны с помощьюContentControl, например

<ListBox ItemsSource="{Binding Data}">
    <ListBox.Resources>
        <!-- The frame that is applied to all items -->
        <ControlTemplate x:Key="commonFrameTemplate" TargetType="{x:Type ContentControl}">
            <Border BorderBrush="Red" BorderThickness="2" CornerRadius="5" Padding="5">
                <StackPanel>
                    <CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}"/>
                    <ContentPresenter /> <!-- Where the individual templates end up -->
                    <Button Content="Delete"/>
                </StackPanel>
            </Border>
        </ControlTemplate>

        <!-- Define templates without using a x:Key but setting the DataType,
             the template will automatically be applied, no need for a
             template-selector -->
        <DataTemplate DataType="{x:Type local:Employee}">
            <TextBlock Text="{Binding Name}" Foreground="Red"/>
        </DataTemplate>

    </ListBox.Resources>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <!-- By setting the content to {Binding} the templating is delegated
                 in a way, if you must use a selector, define one here as
                 ContentTemplateSelector -->
            <ContentControl Template="{StaticResource commonFrameTemplate}"
                            Content="{Binding}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...