Установить значение для шаблонной привязки 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 способ сделать это, но я этого не знаю....