2009-08-26 3 views
0

J'ai un formulaire avec TextBox comme ceci:Comment lier deux propriétés de contrôle à deux propriétés de l'objet correctement

 Form f = new Form(); 
     TextBox t = new TextBox(); 
     t.Click += new EventHandler(t_Click); 
     t.LostFocus += new EventHandler(t_LostFocus); 

     Testus tt = new Testus(); 

     t.DataBindings.Add("Left", Testus , "X"); 
     t.DataBindings.Add("Text", Testus , "Test"); 

     f.Controls.Add(t); 
     f.ShowDialog(); 

Et classe Testus comme ceci:

class Testus 
{ 
    public string Test 
    { 
     get 
     { 
      return _text; 
     } 
     set 
     { 
      Console.WriteLine("Acomplished: text change"); 
      _text = value; 
     } 
    } 
    private string _text; 

    public int X 
    { 
     get 
     { 
      return x; 
     } 
     set 
     { 
      Console.WriteLine("Acomplished: X changed"); 
      x = value; 
     } 
    } 
    int x; 

    public Testus() 
    { 

    } 
} 

Comme vous pouvez le voir, Je lie mon TextBox à la classe Testus. Plus précisément, je lie TextBox.Left à Testus.X et TextBox.Text à Testus.Test. Je voudrais accepter que la modification de la valeur Controls Left affecte la valeur de Testus.X et vice versa. Et de même pour TextBox.Text vs Testus.Test.

J'ai ajouté des gestionnaires pour Cliquez et LostFocus de mon contrôle TextBox comme ceci:

static void t_LostFocus(object sender, EventArgs e) 
    { 
     Console.WriteLine("TextBox lost focus"); 
    } 

    static void t_Click(object sender, EventArgs e) 
    { 
     Console.WriteLine("Moving to right..."); 
     ((Control)sender).Left = 100; 
    } 

Et je fais ce test:

  1. application run
  2. entrer du texte dans TextBox
  3. Modifier le focus sur un autre contrôle

Et je reçois ce résultat dans la console:

TextBox lost focus 

Et thats it! Testus.Test ne change pas sa valeur !?

Mais quand je fais ceci:

  1. exécuter l'application
  2. cliquez sur zone de texte (changer la valeur gauche)

-je obtenir ce résultat:

Moving to right... 
Acomplished: X changed 

Il semble que Liaison gauche à X fonctionne. Et le texte à tester non. Et quand je vais changer de place de liaisons à ceci:

t.DataBindings.Add("Text", Testus , "Test"); 
    t.DataBindings.Add("Left", Testus , "X"); 

que les œuvres de reliure de texte et à gauche à la liaison X ne fonctionne pas. Donc en conclusion: seulement le premier DataBinding fonctionne.

Donc, ma question est: comment lier deux propriétés de TextBox (Left, Text) à deux propriétés de mon objet (Testus) (X, Test) pour que ça fonctionne bien?

Répondre

0

Je l'ai toujours fait comme ça.

Binding b = new Binding("Test"); 
b.Source = tt; 
t.SetBinding(TextBox.TextProperty, b);