スキル レベルのコレクションを RadioButton として表示する ListBox があります。生徒のこれまでの最高成績であったスキル レベルを強調表示 (およびその横に星を表示) したいと思います。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 の一部であるため、プログラムによる解決はより困難になる可能性があります。