2013-03-09 86 views
112

有沒有一種方法,我可以在一個Style做到這一點:綁定ConverterParameter

<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發送到我的轉換器類。

回答

227

ConverterParameter屬性無法綁定,因爲它不是依賴項屬性。

由於Binding不是從DependencyObject派生的,它的所有屬性都不是依賴項屬性。因此,綁定不能成爲另一個綁定的目標對象。

然而,有一種替代解決方案。你可以使用一個MultiBindingmulti-value converter代替一個正常的結合:

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

不,不幸的是這將是不可能的,因爲ConverterParameter不是DependencyProperty所以你將不能夠使用綁定

但是也許你能欺騙和使用MultiBindingIMultiValueConverter在2個Tag特性傳遞。