La liaison XAML ne fonctionne pas sur la propriété de dépendance?

J’essaie (et échoue) de faire la liaison de données sur une propriété de dépendance dans xaml. Cela fonctionne très bien quand j’utilise le code derrière, mais pas dans xaml.

Le contrôle utilisateur est simplement un TextBlock qui se lie à la propriété de dépendance:

    

Et la propriété de dépendance est une simple chaîne:

 public static readonly DependencyProperty TestProperty = DependencyProperty.Register("Test", typeof(ssortingng), typeof(MyControl), new PropertyMetadata("DEFAULT")); public ssortingng Test { get { return (ssortingng)GetValue(TestProperty); } set { SetValue(TestProperty, value); } } 

J’ai une propriété régulière avec l’implémentation habituelle de INotifyPropertyChanged dans la fenêtre principale.

 private ssortingng _myText = "default"; public ssortingng MyText { get { return _myText; } set { _myText = value; NotifyPropertyChanged(); } } 

Jusqu’ici tout va bien. Si je lie cette propriété à un TextBlock dans la fenêtre principale, tout fonctionne TextBlock . Le texte est mis à jour correctement si le MyText change et que tout va bien dans le monde.

  

Cependant, si je fais la même chose sur mon contrôle utilisateur, rien ne se passe.

  

Et maintenant, la partie amusante est que si je fais la même liaison dans le code, cela fonctionne!

 TheControl.SetBinding(MyControl.TestProperty, new Binding { Source = DataContext, Path = new PropertyPath("MyText"), Mode = BindingMode.TwoWay }); 

Pourquoi ça ne marche pas en xaml?

La déclaration de propriété de dépendance doit ressembler à ceci:

 public static readonly DependencyProperty TestProperty = DependencyProperty.Register( "Test", typeof(ssortingng), typeof(MyControl), new PropertyMetadata("DEFAULT")); public ssortingng Test { get { return (ssortingng)GetValue(TestProperty); } set { SetValue(TestProperty, value); } } 

La liaison dans le code XAML du UserControl doit définir l’instance de contrôle en tant qu’object source, par exemple en définissant la propriété RelativeSource du Bindings:

    

Il est également très important de ne jamais définir le DataContext d’un UserControl dans son constructeur. Je suis sûr qu’il y a quelque chose comme

 DataContext = this; 

Supprimez-le, car il empêche efficacement l’inheritance d’un DataContext du parent de UserConrol.

En définissant Source = DataContext dans Binding dans le code situé derrière, vous définissez explicitement une source de liaison, alors que dans

  

la source de liaison est implicitement le DataContext actuel. Toutefois, ce DataContext a été défini par l’affectation dans le constructeur de UserControl à UserControl lui-même et n’est pas le DataContext hérité (c’est-à-dire l’instance de modèle de vue) de la fenêtre.