Maison >développement back-end >C++ >Pourquoi ma liaison XAML ne met-elle pas à jour ma propriété de dépendance ?

Pourquoi ma liaison XAML ne met-elle pas à jour ma propriété de dépendance ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-09 21:05:42758parcourir

Why Isn't My XAML Binding Updating My Dependency Property?

Dépannage des problèmes de liaison WPF XAML avec les propriétés de dépendance

Cet article traite d'un problème WPF courant : la liaison de données XAML ne parvient pas à mettre à jour l'interface utilisateur lorsqu'une propriété de dépendance change, même si la liaison code-behind fonctionne correctement.

Scénario :

Une application WPF utilise une propriété de dépendance en XAML, mais la liaison ne met pas à jour l'interface utilisateur lorsque la valeur de la propriété liée change. Cependant, la liaison code-behind fonctionne comme prévu.

Définition de la propriété de dépendance (incorrecte) :

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

Liaison XAML (problème) :

<code class="language-xaml"><TextBlock Text="{Binding Test}"></TextBlock></code>

La solution :

Le problème principal réside dans l'enregistrement des propriétés de dépendance et la liaison XAML. Voici l'approche corrigée :

Définition de propriété de dépendance corrigée :

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

Liaison XAML corrigée :

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

Ce XAML corrigé définit explicitement le RelativeSource pour trouver le UserControl comme source de liaison.

Considérations importantes :

  • Évitez de définir DataContext dans le constructeur UserControl : La définition du DataContext dans le constructeur d'un UserControl empêche l'héritage du DataContext du parent, provoquant souvent des échecs de liaison.

  • Alternative : liaison explicite dans le code-behind : Si l'utilisation de RelativeSource n'est pas pratique, définissez la liaison explicitement dans le code-behind :

<code class="language-csharp">TheControl.SetBinding(MyControl.TestProperty, new Binding
{
    Source = DataContext, // Use the MainWindow's DataContext
    Path = new PropertyPath("MyText"),
    Mode = BindingMode.TwoWay
});</code>

En suivant ces étapes, vous pouvez vous assurer que vos liaisons XAML mettent correctement à jour vos propriétés de dépendance, conduisant ainsi à une application WPF fonctionnelle et réactive.

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