J'ai un UserControl que je veux participer à la liaison de données. J'ai configuré les propriétés de dépendance dans le contrôle utilisateur, mais je n'arrive pas à le faire fonctionner.Liaison de données à un UserControl dans WPF
L'UC affiche le texte correct lorsque je l'appelle avec du texte statique (par exemple BlueText = "ABC"). Lorsque j'essaie de le lier à une propriété publique locale, il est toujours vide.
<src:BlueTextBox BlueText="Feeling blue" /> <!--OK-->
<src:BlueTextBox BlueText="{Binding Path=MyString}" /> <!--UserControl always BLANK!-->
<TextBox Text="{Binding Path=MyString}" Width="100"/> <!--Simple TextBox Binds OK-->
J'ai fait bouillir le code jusqu'à l'exemple simplifié suivant. Voici le XAML du UserControl:
<UserControl x:Class="Binding2.BlueTextBox" ...
<Grid>
<TextBox x:Name="myTextBox" Text="{Binding BlueText}" Foreground="Blue" Width="100" Height="26" />
</Grid>
Voici le code derrière du UserControl:
public partial class BlueTextBox : UserControl
{
public BlueTextBox()
{
InitializeComponent();
DataContext = this; // shouldn't do this - see solution
}
public static readonly DependencyProperty BlueTextProperty =
DependencyProperty.Register("BlueText", typeof(string), typeof(BlueTextBox));
public string BlueText
{
get { return GetValue(BlueTextProperty).ToString(); }
set { SetValue(BlueTextProperty, value.ToString()); }
}
Cela semble que cela devrait être très facile, mais je ne peux pas le faire fonctionner. Merci de votre aide!
Plus d'infos: Quand j'ai essayé le correctif proposé par Eugene, j'ai remarqué un comportement particulier. J'ai ajouté un PropertyChangedCallback aux métadonnées; Cela me permet de regarder la valeur de BlueText se mettre en place. Lorsque la chaîne est définie sur une valeur statique (= "feeling blue"), l'événement PropertyChanged se déclenche. Le cas de liaison de données ne déclenche pas PropertyChanged. Je pense que cela signifie que la valeur liée aux données n'est pas envoyée à UserControl. (Je pense que le constructeur n'est pas appelé dans le cas statique)
Solution: Les problèmes ont été correctement identifiés par Arcturus et jpsstavares. D'abord, j'ai écrasé la liaison de données quand est défini DataContext = this dans le constructeur du contrôle. Cela a empêché l'établissement de la valeur liée aux données. J'ai aussi dû nommer le contrôle x: Name = root, et spécifier le Binding ElementName = root int le XAML. Pour obtenir la liaison TwoWay, j'avais besoin de régler Mode = TwoWay dans l'appelant. Voici le code correct:
<src:BlueTextBox BlueText="{Binding Path=MyString, Mode=TwoWay}}" /> <!--OK-->
Maintenant, le XAML dans le UserControl:
<UserControl x:Class="Binding2.BlueTextBox" x:Name="root"...
<Grid>
<TextBox x:Name="myTextBox" Text="{Binding ElementName=root, Path=BlueText}" Foreground="Blue" Width="100" Height="26" />
</Grid>
Enfin j'ai enlevé DataContext = ceci dans le constructeur de la UserControl.
public BlueTextBox()
{
InitializeComponent();
//DataContext = this; -- don't do this
}
Merci à tous pour votre aide!
Essayé paramétrez à la fois AffectsRender et AffectsMeasure, mais cela n'a pas eu d'effet. Merci. – RaoulRubin