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 :
DataContext
dans le constructeur du contrôle utilisateur est généralement déconseillé et peut entraîner des problèmes de liaison.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!