1. ホーム
  2. wpf

[解決済み] バインディングConverterParameter

2022-04-21 17:47:45

質問

の中で行う方法はありますか? Style :

<Style TargetType="FrameworkElement">
    <Setter Property="Visibility">
        <Setter.Value>
            <Binding Path="Tag"
                RelativeSource="{RelativeSource AncestorType=UserControl}"
                Converter="{StaticResource AccessLevelToVisibilityConverter}"
                ConverterParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag}" />                        
        </Setter.Value>
    </Setter>
</Style>

を送るだけでいいのです。 Tag を、トップレベルの親と Tag をコンバータ・クラスに変換しています。

どのように解決するのですか?

その ConverterParameter プロパティは、依存関係プロパティではないため、バインドできません。

このため Binding から派生したものではありません。 DependencyObject は、どのプロパティも依存プロパティにはなりえません。結果として、バインディングは他のバインディングのターゲットオブジェクトになることはできません。

しかし、別の解決策があります。それは MultiBinding マルチバリューコンバータ の代わりに、通常のBindingを使用します。

<Style TargetType="FrameworkElement">
    <Setter Property="Visibility">
        <Setter.Value>
            <MultiBinding Converter="{StaticResource AccessLevelToVisibilityConverter}">
                <Binding Path="Tag" RelativeSource="{RelativeSource Mode=FindAncestor,
                                                     AncestorType=UserControl}"/>
                <Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}"/>
            </MultiBinding>
        </Setter.Value>
    </Setter>
</Style>

多値変換器は、入力としてソース値の配列を取得します。

public class AccessLevelToVisibilityConverter : IMultiValueConverter
{
    public object Convert(
        object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values.All(v => (v is bool && (bool)v))
            ? Visibility.Visible
            : Visibility.Hidden;
    }

    public object[] ConvertBack(
        object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}