我有一个带有ItemTemplateSelector的ListBox。模板选择器返回的所有数据模板都有一个Border。我想在鼠标悬停时更改边框的背景颜色。为了实现这一点,我在列表框中添加了一个ListBoxItem控件模板,该模板带有IsMouseOver的触发器,但我不知道如何从触发器的setter引用数据模板的border。我最好的选择是下面的二传手,但没有效果:
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Border.Background" Value="Yellow" />
</Trigger>
有没有一种方法可以在XAML中做到这一点,或者在代码中深入查看可视化树以找到边界?
我还想在ListBox中选择项目时更改Border的背景色。我知道我可以用ListBoxItem
样式更改Foreground
,如下所示:
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
但与Foreground
不同,Background
不是继承的,因此DataTemplate
中的Border
将不会接收到触发器的笔刷。
当使用数据模板中的数据触发器在ListBox
中选择项目时,我能够更改Border
的Background
。
<DataTemplate DataType="{x:Type model:Topic}" x:Key="TopicNameDataTemplate">
<Grid>
<Border x:Name="Border" ... >
...
</Border>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}"
Value="True">
<Setter TargetName="Border" Property="Background" Value="Orange"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>