178

私がこれを行うことができる方法はありますか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コントロール自体のをコンバータークラスに送信する必要があります。

4

3 に答える 3

340

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

Bindingどのプロパティからも派生していないためDependencyObject、依存関係プロパティにすることはできません。結果として、Binding が別の Binding のターゲット オブジェクトになることはありません。

ただし、代替ソリューションがあります。通常の Binding の代わりに、MultiBinding多値コンバーターで を使用できます。

<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();
    }
}
于 2013-03-09T10:48:27.370 に答える
37

いいえ、残念ながら、バインディングを使用できないためConverterParameter、これは不可能です。DependencyProperty

しかし、おそらくごまかしてMultiBindingwithを使用IMultiValueConverterして 2 つのプロパティを渡すことができTagます。

于 2013-03-09T10:47:10.970 に答える