Установить значение для шаблонной привязки listboxitem

У меня есть этот стиль:

<Style x:Key="SelectableListBoxItemStyle" TargetType="{x:Type ListBoxItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">

                <Border Background="Transparent"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        CornerRadius="4"
                        BorderThickness="2"
                        x:Name="IconBorder"
                        Margin="4,2,4,2">
                    <ContentPresenter/>
                </Border>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="true">
                        <Setter TargetName="IconBorder" 
                                Property="BorderBrush" 
                                Value="Blue" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Моя проблема в том, что я не знаю, какое свойство устанавливать в ListBox, при использовании моего стиля, чтобы у границ его ListBoxItems была нужная кисть границ. Я также хотел бы сделать эту работу для другой кисти границы в моем стиле.

Я хотел бы иметь возможность иметь два списка с тем же стилем, но разными цветами границ. У меня есть это для ListBox:

    <ListBox 
        ItemsSource="{Binding SelectedProduct.Pictures}"
        SelectedItem="{Binding SelectedSet, Mode=TwoWay}"
        ItemContainerStyle="{StaticResource ResourceKey= SelectableListBoxItemStyle}">
    </ListBox>

Обновление.. Я попробовал это:

    <ListBox 
        ItemsSource="{Binding SelectedProduct.Pictures}"
        SelectedItem="{Binding SelectedSet, Mode=TwoWay}">

            <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource SelectableListBoxItemStyle}">
                    <Setter TargetName="IconBorder" Property="BorderBrush" Value="Green" />
                </Style>
            </ListBox.ItemContainerStyle>

        </ListBox>

Но я получаю: Ошибка 8 Свойство TargetName не может быть установлено в Style Setter.

2 ответа

Решение

Вместо использования TemplateBinding Вы должны попытаться использовать относительную привязку источника.

BorderBrush="{Binding RelativeSource={RelativeSource FindAncestor, 
                                      AncestorType={x:Type Listbox}}, 
                                      Path=BorderBrush}"

Если вы хотите иметь границу, отличную от определенной для ListBox тогда вам нужно будет добавить ресурс кисти в ваш ResourceDictionary и примените это вместо этого:

<Listbox.Resources>
    <SolidColorBrush x:Key="MyListBoxItemBorderBrush" Color="Red"/>
<Listbox.Resources>

а затем в вашем шаблоне:

BorderBrush="{StaticResource MyListBoxItemBorderBrush}"

Если вам нужны определенные элементы с разными границами, вам нужно взглянуть на StyleSelector.

Я не уверен на 100%, но я думаю, что вам может понадобиться пользовательский контроль для этого. По крайней мере, я знаю, что вы можете сделать это с помощью пользовательского элемента управления!

Если вы создаете пользовательский элемент управления, расширяющийся от ListBox, который включает в себя этот стиль, который вы создали, вы можете затем создать в нем присоединенное свойство (что-то вроде ItemBorderColor), которое вы могли бы привязать к BorderColor вашей границы (фактически, для эффекта выделения, вы можете захотеть создать триггер на вашем ControlTemplate (), который применяет это значение ItemBorderColor к BorderColor границы на основе свойства IsSelected).

Там может быть чистый XAML способ сделать это, но я этого не знаю....

Другие вопросы по тегам