WPF ListView Style Trigger设置ContentStringFormat无效问题求助
问题分析与解决方案
首先咱们来拆解下为什么ContentStringFormat的Setter没生效,而Background却能正常工作:
核心原因
ListViewItem确实继承自ContentControl,自带ContentStringFormat属性,但这个属性只作用于它自身Content的显示格式,这里分两种常见场景:
- 如果你没自定义
ItemTemplate,ListViewItem会默认把你的数据对象(比如ViewModel里的实体)作为Content,调用它的ToString()方法显示,这时候ContentStringFormat能正常格式化这个字符串。但如果你的数据对象ToString()返回的不是你要显示的文本(比如返回类名),那即使设置了格式也看不到效果。 - 更大概率的情况是:你自定义了
ItemTemplate(比如里面放了TextBlock绑定到数据的某个属性,比如{Binding Title}),这时候实际显示的是ItemTemplate里的TextBlock,它的Text是直接绑定到数据属性的,完全绕开了ListViewItem的ContentStringFormat,所以这个Setter自然就被忽略了。
解决方案
根据你的使用场景,给你两种可行的解决办法:
办法1:未使用自定义ItemTemplate时
确保ContentStringFormat的语法正确(注意XAML里大括号需要用{}转义),同时你的数据对象ToString()返回的是你要格式化的文本:
<ListView.Resources> <Style TargetType="{x:Type ListViewItem}"> <Style.Triggers> <DataTrigger Binding="{Binding IsTrue}" Value="true"> <Setter Property="Background" Value="Red"/> <!-- 用{}转义第一个大括号,避免XAML解析错误 --> <Setter Property="ContentStringFormat" Value="{}{0} *"/> </DataTrigger> </Style.Triggers> </Style> </ListView.Resources>
办法2:使用自定义ItemTemplate时(更常见)
把格式逻辑放到ItemTemplate的DataTrigger里,直接修改负责显示的TextBlock:
<ListView> <ListView.ItemTemplate> <DataTemplate> <!-- 绑定你要显示的原始属性 --> <TextBlock x:Name="DisplayText" Text="{Binding YourPropertyName}"/> <DataTemplate.Triggers> <DataTrigger Binding="{Binding IsTrue}" Value="true"> <!-- 给文本添加星号,用StringFormat格式化 --> <Setter TargetName="DisplayText" Property="Text" Value="{Binding YourPropertyName, StringFormat={}{0} *}"/> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> </ListView.ItemTemplate> <ListView.Resources> <Style TargetType="{x:Type ListViewItem}"> <Style.Triggers> <DataTrigger Binding="{Binding IsTrue}" Value="true"> <Setter Property="Background" Value="Red"/> </DataTrigger> </Style.Triggers> </Style> </ListView.Resources> </ListView>
这样既保留了背景色的触发效果,又能正确给目标文本添加星号。
补充说明:如果IsTrue是ListViewItem自身的属性(而非数据对象的属性),那绑定路径要改成{Binding RelativeSource={RelativeSource Self}, Path=IsTrue},不过看你的代码应该是绑定数据对象的属性,所以不用调整。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

