J'essaie (et j'échoue) de faire une liaison de données sur une propriété de dépendance dans xaml. Cela fonctionne très bien quand j'utilise du code derrière, mais pas dans xaml.La liaison XAML ne fonctionne pas sur la propriété de dépendance?
Le contrôle utilisateur est tout simplement un TextBlock
qui se lient à la propriété de dépendance:
<UserControl x:Class="WpfTest.MyControl" [...]>
<TextBlock Text="{Binding Test}" />
</UserControl>
Et la propriété de dépendance est une chaîne simple:
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); }
}
J'ai un bien régulier avec la mise en œuvre habituelle de INotifyPropertyChanged
dans la fenêtre principale.
private string _myText = "default";
public string MyText
{
get { return _myText; }
set { _myText = value; NotifyPropertyChanged(); }
}
Jusqu'ici tout va bien. Si je lie cette propriété à un TextBlock
sur la fenêtre principale tout fonctionne très bien. Le texte se met à jour correctement si le MyText
change et tout va bien dans le monde.
<TextBlock Text="{Binding MyText}" />
Cependant, si je fais la même chose sur mon contrôle utilisateur, rien ne se passe.
Et maintenant la partie amusante est que si je fais la même liaison dans le code derrière cela fonctionne!
TheControl.SetBinding(MyControl.TestProperty, new Binding
{
Source = DataContext,
Path = new PropertyPath("MyText"),
Mode = BindingMode.TwoWay
});
Pourquoi cela ne fonctionne-t-il pas dans xaml?
Afficher davantage de votre code XAML. Je soupçonne que si vous vous liez à {Binding}, vous constaterez que vous liez au mauvais contexte de données. – SledgeHammer
Vous devez transmettre le nom de la propriété ("Test") en tant que premier paramètre à la méthode Register. Je ne pouvais pas trouver une surcharge qui reçoit un type comme premier paramètre. –
Quel est le DataContext du MyControl?Cela pourrait être la MainWindow –