ListView选中项内Grid背景色切换失效,求解决方案
解决ListView项选中时Grid背景色不变化的问题
你的代码存在几个关键问题导致选中状态不生效,以下是修正方案:
问题分析
- 硬编码背景色覆盖样式:Grid直接设置了
Background="White",强制覆盖了选中状态的样式值。 - 资源语法错误与键值不匹配:你定义的
ListViewItemBackgroundUnselected存在语法错误(Color后缺少=),且默认资源键无法直接作用于DataTemplate内的Grid。 - UserControl隔离状态传递:嵌套的UserControl阻断了ListViewItem的选中状态向内部Grid的传递,属于多余嵌套。
修正后的代码
方案1:通过DataTrigger绑定选中状态(推荐)
直接在Grid上绑定父级ListViewItem的选中状态,动态切换背景色:
<ListView x:Name="kategoriListView" Margin="35,20,30,20" VerticalAlignment="Stretch" AutomationProperties.AutomationId="ItemsListView" AutomationProperties.Name="Items" ScrollViewer.VerticalScrollBarVisibility="Visible" CornerRadius="15"> <ListView.ItemTemplate> <DataTemplate> <Grid x:Name="grid" HorizontalAlignment="Stretch" Height="50" CornerRadius="15"> <TextBlock x:Name="kelasText" Margin="10,0,0,0" VerticalAlignment="Center" FontSize="17" FontWeight="Bold" Foreground="Black" Text="{Binding KategoriList}" /> <Grid.Style> <Style TargetType="Grid"> <Setter Property="Background" Value="White"/> <Style.Triggers> <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem}}" Value="True"> <Setter Property="Background" Value="Blue"/> </DataTrigger> </Style.Triggers> </Style> </Grid.Style> </Grid> </DataTemplate> </ListView.ItemTemplate> </ListView>
方案2:重写ListViewItem模板实现全局样式
如果需要统一所有列表项的选中样式,可以重写ListViewItem的默认模板:
<ListView x:Name="kategoriListView" Margin="35,20,30,20" VerticalAlignment="Stretch" AutomationProperties.AutomationId="ItemsListView" AutomationProperties.Name="Items" ScrollViewer.VerticalScrollBarVisibility="Visible" CornerRadius="15"> <ListView.ItemTemplate> <DataTemplate> <Grid x:Name="grid" HorizontalAlignment="Stretch" Height="50" CornerRadius="15" Background="{TemplateBinding Background}"> <TextBlock x:Name="kelasText" Margin="10,0,0,0" VerticalAlignment="Center" FontSize="17" FontWeight="Bold" Foreground="Black" Text="{Binding KategoriList}" /> </Grid> </DataTemplate> </ListView.ItemTemplate> <ListView.Resources> <Style TargetType="ListViewItem"> <Setter Property="Background" Value="White"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListViewItem"> <Border Background="{TemplateBinding Background}" CornerRadius="15" Padding="0"> <ContentPresenter /> </Border> <ControlTemplate.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="Blue"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ListView.Resources> </ListView>
关键修正点
- 移除多余的
UserControl,让Grid能接收ListViewItem的状态传递 - 取消Grid的硬编码背景色,改用样式触发器或模板绑定动态切换
- 通过
RelativeSource绑定父级ListViewItem的IsSelected属性,实现状态联动
内容的提问来源于stack exchange,提问作者cielo
相关产品推荐
相关产品推荐

