绑定ConverterParameter

有一种方式,我可以在一个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派生的,它的任何属性都不能成为依赖属性。 因此,绑定不能成为另一个绑定的目标对象。

然而,有一个替代解决scheme。 您可以使用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> 

多值转换器获取一个源数组作为input:

 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(); } } 

不,不幸的是,这是不可能的,因为ConverterParameter不是一个DependencyProperty所以你将无法使用绑定

但也许你可以作弊并使用带有IMultiValueConverterMultiBinding来传递2个Tag属性。