WPF Combobox项背景绑定:基于布尔值高亮动态列表问题
WPF ComboBox根据布尔值动态高亮特定列表项
需求是实现WPF ComboBox列表中根据布尔值条件高亮特定项,手动添加ComboBoxItem并标记Tag能实现,但需要通过绑定实现更动态的效果。最初尝试用Dictionary方案,但遇到绑定问题:XAML中DataTrigger绑定的是Dictionary的Values集合而非对应键的单个布尔值,无法正确高亮。最终通过自定义实体类集合的方式解决了问题。
原Dictionary方案(存在绑定问题)
XAML代码
<ComboBox Name="Box" HorizontalAlignment="Left" Margin="81,102,0,0" VerticalAlignment="Top" Width="120" ItemsSource="{Binding Items.Keys}"> <ComboBox.Resources> <Style TargetType="{x:Type ComboBoxItem}"> <Style.Triggers> <DataTrigger Binding="{Binding Items.Values}" Value="True"> <Setter Property="Background" Value="Yellow"/> </DataTrigger> </Style.Triggers> </Style> </ComboBox.Resources> </ComboBox>
后台VB代码
Public Module GlobalVariables Public Item As New TestItem End Module Class MainWindow Public Sub New() InitializeComponent() DataContext = Item End Sub End Class Public Class TestItem Public Property Items As New Dictionary(Of String, Boolean) Public Sub New() Items.Add("1", False) Items.Add("2", True) Items.Add("3", False) Items.Add("4", False) Items.Add("5", True) End Sub End Class
问题说明:绑定Items.Values会获取整个字典的值集合,无法对应到当前ComboBoxItem所关联的单个布尔值,导致高亮触发逻辑完全失效。
解决后的自定义实体类方案
XAML代码
<ComboBox Name="Box" HorizontalAlignment="Left" Margin="81,102,0,0" VerticalAlignment="Top" Width="120" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedObject}" DisplayMemberPath="Name"> <ComboBox.Resources> <Style TargetType="{x:Type ComboBoxItem}"> <Style.Triggers> <DataTrigger Binding="{Binding Highlighted}" Value="True"> <Setter Property="Background" Value="Yellow"/> </DataTrigger> </Style.Triggers> </Style> </ComboBox.Resources> </ComboBox>
后台VB代码
Public Module GlobalVariables Public TestCollection As New ItemCollection End Module Class MainWindow Public Sub New() InitializeComponent() DataContext = TestCollection End Sub End Class Public Class Item Public Property Highlighted As Boolean Public Property Name As String End Class Public Class ItemCollection Public Property Items As New List(Of Item) Public Property SelectedObject As Item Public Sub New() Items.Add(New Item With {.Name = "1", .Highlighted = False}) Items.Add(New Item With {.Name = "2", .Highlighted = True}) Items.Add(New Item With {.Name = "3", .Highlighted = False}) Items.Add(New Item With {.Name = "4", .Highlighted = False}) Items.Add(New Item With {.Name = "5", .Highlighted = True}) End Sub End Class
解决思路:创建包含Name(显示文本)和Highlighted(高亮标记)的自定义实体类Item,用List(Of Item)作为ComboBox的数据源。此时每个ComboBoxItem的DataContext就是单个Item对象,DataTrigger直接绑定Highlighted属性即可精准判断当前项是否需要高亮。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

