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
Barbara Streisandoriginal
2025-01-09 21:08:43336parcourir

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>

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>

MainWindow ViewModel (ou DataContext) :

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

Liaison dans MainWindow (réussie) :

<code class="language-xml"><TextBlock Text="{Binding MyText}" /></code>

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

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

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>

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>

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!

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