2013-03-09 15 views
112

C'è un modo ho potuto fare questo in un Style:Binding 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> 

Ho semplicemente bisogno di inviare la Tag di genitore di alto livello e la Tag di controllo stesso per la mia classe convertitore.

risposta

227

La proprietà ConverterParameter non può essere associata perché non è una proprietà di dipendenza.

Poiché Binding non è derivato da DependencyObject, nessuna delle sue proprietà può essere proprietà di dipendenza. Di conseguenza, un binding non può mai essere l'oggetto target di un altro binding.

Esiste tuttavia una soluzione alternativa. Si potrebbe utilizzare un MultiBinding con multi-value converter invece di un normale 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> 

Il convertitore multi-valore ottiene una matrice di valori di origine come 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(); 
    } 
} 
29

No, purtroppo questo non sarà possibile, perché ConverterParameter non è un DependencyProperty in modo da non essere in grado di utilizzare attacchi

Ma forse si potrebbe bari usando un MultiBinding con IMultiValueConverter a passare nei 2 Tag proprietà .