我有一个 ListBox,它将技能级别的集合显示为 RadioButtons。我想突出显示学生之前最好成绩的技能水平(并在其旁边显示一颗星)。我将 ListBox 的 DataContext 设置为 Skill 对象,并将其 ItemsSource 绑定到 SkillLevels 集合。
Skill
+ClassSkillLevelID //选择的技能等级
+PreviousBestSkillLevelID
+SkillLevels
我可以使用 ListBox 的 SelectedValue 功能绑定 ClassSkillLevelID 以选择正确的 RadioButton。但是如何突出显示具有与 PreviousBestSkillLevelID 匹配的技能级别 ID 的 RadioButton?
我尝试使用 DependencyProperty 创建一个 ValueConverter,以便我可以将 DependencyProperty 的值设置为 PreviousBestSkillLevelID 并将每个 RadioButton 的 ID 与之进行比较。但我认为转换器不在可视树中,所以我无法访问父对象以访问 PreviousBestSkillLevelID:
<ListBox x:Name="lbSkillLevels"
ItemsSource="{Binding Path=SkillLevels}"
SelectedValue="{Binding Path=ClassSkillLevelID, Converter={StaticResource nullEmptyConverter}, ConverterParameter=System.Guid}"
SelectedValuePath="ID">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
...
</Grid.ColumnDefinitions>
<RadioButton IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBoxItem, AncestorLevel=1}, Path=IsSelected}">
<RadioButton.Style>
<Style TargetType="RadioButton">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<Binding Path="ID">
<Binding.Converter>
<local:SkillIDMatchConverter ValueToMatch="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox, AncestorLevel=1}, Path=DataContext.PreviousBestSkillLevelID}"/>
</Binding.Converter>
</Binding>
</DataTrigger.Binding>
<DataTrigger.Setters>
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect BlurRadius="4" Color="Yellow" Direction="0" ShadowDepth="0" />
</Setter.Value>
</Setter>
</DataTrigger.Setters>
</DataTrigger>
</Style.Triggers>
</Style>
</RadioButton.Style>
</RadioButton>
<TextBlock Grid.Column="1" Text="{Binding Path=Name}">
</TextBlock>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
此 ListBox 是父 ItemsControl 的 DataTemplate 的一部分,因此编程解决方案可能更加困难。