0

私の Window には、ViewModel のプロパティの 1 つで可能な 6 つの状態を示す一連の 6 つのボタンがあります。アクティブなものを強調表示する必要があります。これを行うために、ボタン用に次の ControlTemplate を作成しました。

<ControlTemplate x:Key="SnijRichtingTemplate" TargetType="Button">
    <Border Name="toggleButton" BorderThickness="1" BorderBrush="{StaticResource KleurRadioCheckOuter}" Background="Transparent" Width="20" Height="20" Cursor="Hand">
        <TextBlock Name="text" Foreground="{StaticResource KleurRadioCheckOuter}"
                   Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}"
                   ToolTip="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag.ToolTip}"
                   HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Border>

    <ControlTemplate.Triggers>
        <DataTrigger Value="True">
            <DataTrigger.Binding>
                <MultiBinding Converter="{StaticResource EqualityToBooleanConverter}">
                    <Binding Path="SnijRichting" />
                    <Binding Path="Tag" RelativeSource="{RelativeSource TemplatedParent}" />
                </MultiBinding>
            </DataTrigger.Binding>
            <Setter TargetName="toggleButton" Property="BorderBrush" Value="{StaticResource KleurTekstDonker}" />
            <Setter TargetName="text" Property="Foreground" Value="{StaticResource KleurTekstDonker}" />
        </DataTrigger>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="toggleButton" Property="BorderBrush" Value="{StaticResource Kleur2}" />
            <Setter TargetName="text" Property="Foreground" Value="{StaticResource Kleur2}" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

テンプレートは次のように使用されます。

<Button Grid.Column="0" Template="{StaticResource SnijRichtingTemplate}"
        HorizontalAlignment="Right" Click="SnijRichting_Click"
        Tag="{StaticResource XLinks}" />

タグは、XAML で定義された単なるインスタンスです。

<wg:SnijRichting x:Key="XLinks" SnijAs="X" Negatief="True" />

MultibindingConverter は特別なものではありません:

public class EqualityToBooleanConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return values[0] == values[1];
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

基本的に、各ボタンには新しい値を持つタグがあります。クリック ハンドラーでは、ViewModel のプロパティがボタンのタグに設定されます。ボタンの状態は、ボタンの Tag が ViewModel プロパティと等しいかどうかを確認することによって更新されます。

問題は、これが機能しないことです。EqualityToBooleanConverter が実行されると、2 番目の値は null になります。2 番目のバインディングから Path="Tag" ビットを削除すると、TemplatedParent が期待していた Button ではなく ContentPresenter であることがわかります。これは、Tag が null である理由を説明しています。もちろん、ValueConverter を記述して VisualTreeHelper.GetParent を使用して正しい値を取得し、ContentPresenter の親 (目的のボタンを返す) を取得することもできますが、XAML からこれを行う方法が必ずあるはずです。ContentPresenter の Parent は明らかに Border であるため、明らかな Path="Parent.Tag" は機能しません。

XAML からボタンの Tag プロパティにアクセスする方法を知っている人はいますか?

4

1 に答える 1