Maison > développement back-end > C++ > Pourquoi ma liaison XAML ne fonctionne-t-elle pas sur une propriété de dépendance dans un contrôle utilisateur WPF ?

Pourquoi ma liaison XAML ne fonctionne-t-elle pas sur une propriété de dépendance dans un contrôle utilisateur WPF ?

Barbara Streisand
Libérer: 2025-01-09 21:08:43
original
280 Les gens l'ont consulté

Why Doesn't My XAML Binding Work on a Dependency Property in a WPF User Control?

Contrôle utilisateur WPF : problèmes de liaison XAML avec les propriétés de dépendance

La liaison à une propriété de dépendance dans le XAML d'un contrôle utilisateur WPF peut être délicate. Examinons un scénario courant :

Contrôle utilisateur avec TextBlock :

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

Propriété de dépendance dans le contrôle utilisateur :

<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

MainWindow ViewModel (ou DataContext) :

<code class="language-csharp">private string _myText = "default";
public string MyText
{
    get { return _myText; }
    set { _myText = value; NotifyPropertyChanged(); }
}</code>
Copier après la connexion

Liaison dans MainWindow (réussie) :

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

Liaison dans le contrôle utilisateur (échec) :

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

Liaison Code-Behind (réussie) :

<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

Cause fondamentale :

La liaison XAML dans le contrôle utilisateur échoue car la source de liaison n'est pas explicitement définie. Il s'agit par défaut des propres propriétés du contrôle utilisateur.

Solution :

Spécifiez la source de liaison en utilisant RelativeSource :

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

Cela indique explicitement à la liaison de rechercher l'ancêtre du type UserControl pour la propriété Test. Alternativement, vous pouvez utiliser AncestorType={x:Type Window} si le contexte de données est au niveau de la fenêtre.

Considérations clés :

  • Évitez DataContext dans le constructeur de contrôle utilisateur : Définir le DataContext dans le constructeur du contrôle utilisateur est généralement déconseillé et peut entraîner des problèmes de liaison.
  • Liaison Code-Behind explicite : Pour une liaison robuste, envisagez de définir des liaisons explicitement dans le code-behind, comme démontré ci-dessus. Cela offre plus de contrôle et de clarté.

En suivant ces directives, vous pouvez établir une liaison fiable avec les propriétés de dépendance dans vos contrôles utilisateur WPF.

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