Maison > développement back-end > C++ > Pourquoi ma liaison XAML ne fonctionne-t-elle pas sur une propriété de dépendance, mais fonctionne-t-elle en code-behind ?

Pourquoi ma liaison XAML ne fonctionne-t-elle pas sur une propriété de dépendance, mais fonctionne-t-elle en code-behind ?

Patricia Arquette
Libérer: 2025-01-09 21:11:45
original
499 Les gens l'ont consulté

Why Doesn't My XAML Binding Work on a Dependency Property, But Works in Code-Behind?

La liaison XAML échoue sur les propriétés de dépendance

La liaison de données pour les propriétés de dépendance n'a aucun effet en XAML, mais fonctionne bien en code-behind. L'extrait de code suivant illustre le problème :

<code class="language-xml"><UserControl ...="" x:Class="WpfTest.MyControl">
    <TextBlock Text="{Binding Test}"/>
</UserControl></code>
Copier après la connexion

Les propriétés de dépendance sont définies comme suit :

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

public string Test
{
    get { return (string)GetValue(TestProperty); }
    set { SetValue(TestProperty, value); }
}</code>
Copier après la connexion

Dans la fenêtre principale, la liaison aux propriétés normales fonctionne parfaitement :

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

Cependant, la même liaison dans le contrôle utilisateur ne met pas à jour le texte :

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

Il convient de noter que la liaison fonctionne correctement lorsqu'elle est implémentée dans le code-behind :

<code class="language-csharp">TheControl.SetBinding(MyControl.TestProperty, new Binding
{
    Source = DataContext,
    Path = new PropertyPath("MyText"),
    Mode = BindingMode.TwoWay
});</code>
Copier après la connexion

Solution :

Déclaration correcte des propriétés 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

Liaison dans UserControl XAML :

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

Évitez de définir DataContext dans le constructeur UserControl :

Ne définissez jamais le DataContext dans le constructeur du UserControl. Cela empêche le UserControl d'hériter du DataContext de son parent.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal