2013-03-19 11 views
30

ottengo questo errore:Non riesci a trovare fonte per il legame con il riferimento 'RelativeSource FindAncestor'

Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1'' 

su questo legame:

<DataGridTemplateColumn Visibility="{Binding DataContext.IsVisible, RelativeSource={RelativeSource AncestorType={x:Type UserControl}},Converter={StaticResource BooleanToVisibilityConverter}}"> 

Il ViewModel è seduto come DataContext in UserControl. Il DataContext di DataGrid (che si trova in UserControl) è una proprietà all'interno di ViewModel, in ViewModel ho una variabile che dice se mostrare una determinata linea o meno, il suo binding fallisce, perché?

Qui la mia proprietà:

private bool _isVisible=false; 

    public bool IsVisible 
    { 
     get { return _isVisible; } 
     set 
     { 
      _isVisible= value; 
      NotifyPropertyChanged("IsVisible"); 
     } 
    } 

Quando si tratta di funzione: NotifyPropertyChanged il nulla evento PropertyChanged - media non è riuscito a registrare per l'associazione.

Va notato che ho più attacchi per ViewModel in modo tale che funziona, ecco un esempio:

Command="{Binding DataContext.Cmd, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" 

risposta

49

DataGridTemplateColumn non fa parte della struttura visiva o logica, e quindi non ha legame antenato (o qualsiasi antenato) per cui lo RelativeSource non funziona.

Invece è necessario assegnare esplicitamente l'associazione.

<UserControl.Resources> 
    <local:BindingProxy x:Key="proxy" Data="{Binding}" /> 
</UserControl.Resources> 

<DataGridTemplateColumn Visibility="{Binding Data.IsVisible, 
    Source={StaticResource proxy}, 
    Converter={StaticResource BooleanToVisibilityConverter}}"> 

E il proxy vincolante.

public class BindingProxy : Freezable 
{ 
    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 

    public object Data 
    { 
     get { return (object)GetValue(DataProperty); } 
     set { SetValue(DataProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Data. 
    // This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DataProperty = 
     DependencyProperty.Register("Data", typeof(object), 
     typeof(BindingProxy), new UIPropertyMetadata(null)); 
} 

Credits.

+0

Ora viene visualizzato questo errore: Errore percorso BindingExpression: proprietà 'IsVisible' non trovata su 'oggetto' '' BindingProxy ' –

+1

Whoops, che dovrebbe essere Data.IsVisible. –

+0

Grande! Finalmente funziona, grazie mille. –

Problemi correlati