Самый простой способ - избавиться от Style
, который вы объявляете для вашего ListBoxItem
, и использовать вместо него DataTrigger
в DataTemplate
, который вы используете внутри ListBox
:
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}}" Value="True">
<Setter TargetName="grid" Property="Background" Value="Red"></Setter>
</DataTrigger>
</DataTemplate.Triggers>
(Не забудьте добавить x:Name="grid"
к вашему Grid
.)
Привязка RelativeSource
позволяет WPF искать визуальное дерево, пока не найдет ListBoxItem
(и это произойдет, потому что выявляются шаблонами Content
каждого ListBoxItem
).
Это установит свойство Background
содержимого ListBoxItem
в Red
. Он не изменит свойства Background
самого ListBoxItem
!
Если это то, что вам нужно, более сложный, но самый мощный вариант - полностью перезаписать свойство Template
ListBoxItem
, используяa Style
:
<Style x:Key="{x:Type ListBoxItem}" TargetType="ListBoxItem">
<Setter Property="SnapsToDevicePixels" Value="true" />
<Setter Property="OverridesDefaultStyle" Value="true" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border x:Name="Border" Padding="2" SnapsToDevicePixels="true">
<Border.Background>
<SolidColorBrush Color="Transparent" />
</Border.Background>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="SelectionStates">
<VisualState x:Name="Unselected" />
<VisualState x:Name="Selected">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0" Value="Red" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="SelectedUnfocused">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0" Value="Green" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ContentPresenter />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Таким образом, вы можете переопределить каждое свойство во всех состояниях (Selected
, Unselected
, Focused
и т. д.). Это только отправная точка, вдохновленная этой страницей MSDN .
К сожалению, невозможно переопределить только часть ControlTemplate
. Если вы переписываете его, вам нужно переписать каждую его часть, даже те части, которые вы не хотите менять.