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
Libérer: 2025-01-09 20:52:43
original
540 Les gens l'ont consulté

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>
Copier après la connexion

2. Définir Bindings.RelativeSource en XAML

<code class="language-xml"><TextBlock Text="{Binding Test,
    RelativeSource={RelativeSource AncestorType=UserControl}}"></TextBlock></code>
Copier après la connexion

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>
Copier après la connexion

Définir implicitement la source de liaison dans XAML :

<code class="language-xml"><MyControl Test="{Binding MyText}"></MyControl></code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal