Bonjour tout le monde,
j'essaye de me faire mon propre HelloWorld pour bien comprendre le dataBinding, mais j'ai un léger problème : le binding ne semble se faire qu'une seule fois, alors que je le spécifie bien en twoWay.
J'ai suivi les recommandations sur les perf d'après ce lien. J'utilise donc des DependencyObject et DependencyProperty
Voici ma classe de base :
Une bête classe qui contient une string... difficile de faire plus simple!
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public class DataSource : DependencyObject { public DataSource(String text) { Text = text; } public String Text { get { return (String)this.GetValue(TextProperty); } set { MessageBox.Show("tadam"); this.SetValue(TextProperty, value); } } public static readonly DependencyProperty TextProperty = DependencyProperty.Register( "Text", typeof(String), typeof(DataSource), new PropertyMetadata(String.Empty)); }
Maintenant, je veux lier une instance de cette classe avec une textBox. (Note : oui, je sais, je pourrai faire la même chose avec OnEditChanged et monInstance.Text = maTextBox.Text, mais je veux comprendre le databinding pour l'appliquer ensuite à des cas beaucoup plus complexes)
Dans ma fenetre, j'ai un membre de type DataSource
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 private DataSource myDataSource = null;
et dans le Init de la fentre, je fais :
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 private void OnLoaded(object sender, RoutedEventArgs e) { myDataSource = new DataSource("TOTO"); //Binding binding = new Binding("Text"); binding.Source = myDataSource; binding.Mode = BindingMode.TwoWay; binding.UpdateSourceTrigger = UpdateSourceTrigger.LostFocus; textBox1.SetBinding(TextBox.TextProperty, binding); }
Lorsque la fenetre apparait, elle contient bien TOTO.
Par contre, quand je modifie ma textBox, le texte de mon instance n'est pas modifié (j'ai mis un brkpoint sur le set).
Qu'est ce qui ne va pas ?
J'ai essayé aussi de faire le binding en XAML. Dans ce cas, en code behind, j'ai juste:
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 textBox1.DataContext = myDataSource;
et dans mon xaml :
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <TextBox.Text> <Binding Path="Text" UpdateSourceTrigger="PropertyChanged"></Binding> </TextBox.Text>
Même résultat...
Je pense que la solution est simple, mais je ne comprend pas d'où vient mon erreur. Est ce que quelqu'un a une idée lumineuse ? Merci!
Partager