Maison >développement back-end >C++ >Pourquoi ma liaison XAML à une propriété de dépendance échoue-t-elle, mais le code-behind fonctionne-t-il ?

Pourquoi ma liaison XAML à une propriété de dépendance échoue-t-elle, mais le code-behind fonctionne-t-il ?

DDD
DDDoriginal
2025-01-09 20:52:43587parcourir

Why Is My XAML Binding to a Dependency Property Failing, But Code-Behind Works?

Les propriétés de dépendance de liaison XAML ont échoué

Question

La liaison des propriétés de dépendance échoue en XAML mais fonctionne correctement en code-behind.

Raison

  1. Erreur de déclaration de propriété de dépendance : TestProperty La déclaration de la propriété de dépendance ne contient pas l'opérateur nameof(), ce qui entraîne une incompatibilité entre le nom de la propriété et le chemin de liaison XAML.
  2. Erreur de source de liaison dans XAML : La source de liaison (DataContext) n'est pas explicitement définie dans la liaison XAML, elle est donc par défaut le UserControl lui-même, plutôt que le DataContext hérité de la fenêtre parent.
  3. Définir DataContext dans le constructeur : La définition de la propriété DataContext dans le constructeur de UserControl empêchera l'héritage du DataContext du parent, ce qui rendra la source de liaison invalide.

Solution

1. Déclarer correctement les attributs de dépendance

<code class="language-csharp">public static readonly DependencyProperty TestProperty =
    DependencyProperty.Register(
        nameof(Test),
        typeof(string),
        typeof(MyControl),
        new PropertyMetadata("DEFAULT"));</code>

2. Définir Bindings.RelativeSource en XAML

<code class="language-xml"><TextBlock Text="{Binding Test,
    RelativeSource={RelativeSource AncestorType=UserControl}}"></TextBlock></code>

3. Supprimez l'affectation DataContext dans le constructeur

Supprimez la ligne de code DataContext = this; du constructeur UserControl.

Notes supplémentaires

Définissez explicitement la source de liaison dans le code-behind :

<code class="language-csharp">TheControl.SetBinding(MyControl.TestProperty, new Binding
{
    Source = DataContext,
    ...
});</code>

Définir implicitement la source de liaison dans XAML :

<code class="language-xml"><MyControl Test="{Binding MyText}"></MyControl></code>

En XAML, la source de liaison implicite est par défaut le DataContext actuel et doit être définie correctement par la fenêtre parent. La définition du DataContext dans le constructeur de UserControl écrasera le DataContext hérité, provoquant l'échec de la liaison. En définissant Source = DataContext dans la liaison code-behind, la source de liaison est explicitement définie sur le DataContext hérité, garantissant ainsi que la liaison est valide.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn