0

スキル レベルのコレクションを 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 の一部であるため、プログラムによる解決はより困難になる可能性があります。

4

1 に答える 1

0

私はWPFから離れすぎています。難しくしすぎました。何らかの理由で、単一の Binding または MultiDataTrigger でのみ DataTrigger を使用できるという印象の下で作業していました。この質問は私を軌道に戻しました。両方の値を取得するための MultiBinding を備えた DataTrigger と、それらが一致したときにそれらを true に変換するためのコンバーターが必要でした。

<RadioButton IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBoxItem, AncestorLevel=1}, Path=IsSelected}" VerticalAlignment="Center" Margin="3,0,3,3">
<RadioButton.Style>
    <Style TargetType="RadioButton">
        <Style.Triggers>
            <DataTrigger Value="True">
                <DataTrigger.Binding>
                    <MultiBinding Converter="{StaticResource guidMatchConverter}">
                        <Binding Path="ID" />
                        <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType=ListBox, AncestorLevel=1}" Path="DataContext.PreviousBestSkillLevelID" />
                    </MultiBinding>
                </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>

コンバーターは次のようなものです。

public class GuidMatchConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values == null || values.Length < 2) 
            return false;
        else
            return (Guid)values[0] == (Guid)values[1];
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2013-07-11T20:18:05.110 に答える