WPF中ListView+GridView的Style.Trigger失效问题求解决
修复方案
问题根源
- 自定义模板缺失背景容器:原
Default模板仅包含GridViewRowPresenter,该控件不会渲染背景色,导致Background设置完全无效。 - 选中状态触发器错误:使用
DataTrigger绑定ListBoxItem的IsSelected属性,且值设为字符串"X",但ListViewItem的IsSelected是布尔类型,应直接监听自身属性。 - 样式继承错误:继承了
MaterialDesignListBoxItem样式,而非对应ListViewItem的MaterialDesignListViewItem,导致MaterialDesign的交互样式无法生效。 - 模板未包含交互状态:自定义模板未实现鼠标悬停、选中的视觉状态逻辑,覆盖了MaterialDesign的默认交互效果。
修改后的代码
App.xaml 中的 ControlTemplate 修改
<ControlTemplate x:Key="Default" TargetType='{x:Type ListViewItem}'> <!-- 添加Border作为背景容器,绑定控件的Background、Padding等属性 --> <Border x:Name="ItemBorder" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> <GridViewRowPresenter Content="{TemplateBinding Content}" Columns="{TemplateBinding GridView.ColumnCollection}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> </Border> <!-- 添加交互状态触发器,还原MaterialDesign风格的悬停、选中效果 --> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="ItemBorder" Property="Background" Value="{DynamicResource MaterialDesignListItemHoverBackground}"/> </Trigger> <Trigger Property="IsSelected" Value="True"> <Setter TargetName="ItemBorder" Property="Background" Value="{DynamicResource MaterialDesignListItemSelectedBackground}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate>
App.xaml 中的 Style 修改
<!-- 改为继承MaterialDesignListViewItem样式,确保基础交互逻辑生效 --> <Style x:Key="colorListViewItem" TargetType="ListViewItem" BasedOn="{StaticResource MaterialDesignListViewItem}"> <Setter Property="Height" Value="40"/> <Setter Property="Padding" Value="10,5"/> <Setter Property="HorizontalAlignment" Value="Stretch" /> <Setter Property="Template" Value="{StaticResource Default}" /> <Style.Triggers> <!-- 修正选中状态触发器:直接监听自身IsSelected布尔属性 --> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="#FFCCCC" /> </Trigger> <!-- 保留Connect状态的DataTrigger --> <DataTrigger Binding="{Binding Connect}" Value="O"> <Setter Property="Background" Value="#CCFFCC" /> </DataTrigger> <DataTrigger Binding="{Binding Connect}" Value="✔"> <Setter Property="Background" Value="#CCFFCC" /> </DataTrigger> </Style.Triggers> </Style>
额外说明
- 如果需要让
Connect状态的背景色优先级高于选中状态,可以使用MultiDataTrigger调整逻辑,或者修改触发器的顺序(后定义的触发器优先级更高)。 - 确保绑定的
Connect属性值与触发器中的"O"、"✔"完全匹配(注意大小写、特殊字符的一致性)。
内容的提问来源于stack exchange,提问作者hj kim
相关产品推荐
相关产品推荐

