web-dev-qa-db-fra.com

Impossible de trouver la source de liaison avec la référence «RelativeSource FindAncestor»

Je reçois cette erreur:

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

sur cette liaison:

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

Le ViewModel est assis en tant que DataContext dans UserControl. Le DataContext du DataGrid (assis dans UserControl) est une propriété dans le ViewModel, dans ViewModel j'ai une variable qui dit s'il faut afficher ou non une certaine ligne, sa liaison échoue, pourquoi?

Voici ma propriété:

    private bool _isVisible=false;

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

En ce qui concerne la fonction: NotifyPropertyChanged, l'événement PropertyChanged null - signifie qu'il n'a pas pu s'inscrire pour la liaison.

Il convient de noter que j'ai plus de liaisons vers ViewModel de telle manière que cela fonctionne, voici un exemple:

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

DataGridTemplateColumn ne fait pas partie de l'arborescence visuelle ou logique, et n'a donc pas d'ancêtre de liaison (ou de tout ancêtre), donc le RelativeSource ne fonctionne pas.

Au lieu de cela, vous devez donner explicitement la source à la liaison.

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

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

Et le proxy contraignant.

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

Crédits .

66
Cameron MacFarland