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 :
<UserControl ... x:Class="WpfTest.MyControl"> <TextBlock Text="{Binding Test}" /> </UserControl>
Propriété de dépendance dans le contrôle utilisateur :
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); } }
MainWindow ViewModel (ou DataContext) :
private string _myText = "default"; public string MyText { get { return _myText; } set { _myText = value; NotifyPropertyChanged(); } }
Liaison dans MainWindow (réussie) :
<TextBlock Text="{Binding MyText}" />
Liaison dans le contrôle utilisateur (échec) :
<MyControl Test="{Binding MyText}" />
Liaison Code-Behind (réussie) :
TheControl.SetBinding(MyControl.TestProperty, new Binding { Source = DataContext, Path = new PropertyPath("MyText"), Mode = BindingMode.TwoWay });
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
:
<UserControl ... x:Class="WpfTest.MyControl"> <TextBlock Text="{Binding Test, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" /> </UserControl>
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!