2010-08-11 29 views
6

Ich versuche, einen (sehr) einfache Datenbindung Test zu machen, aber es wie erwartet funktioniert nicht ... sagen, ich habe die folgenden Klassen:Einfacher Databinding

// this class represents some kind of data producer 
public class DataSourceClass 
    { 
     public string Data { get; set; } 

     public DataSourceClass() 
     { } 
    } 


//this form holds the TextBox control as the Data consumer 
public partial class DatabindingTestForm : Form 
    { 
     public DataSourceClass ds { get; set; } 
     public DatabindingTestForm() 
     { 
      InitializeComponent(); 
      ds = new DataSourceClass(); 
      textBox.DataBindings.Add("Text", ds, "Data"); 
     } 

     private void checkBox_CheckedChanged(object sender, EventArgs e) 
     { 
      if (checkBox.Checked) 
       ds.Data = "CHECKED"; 
      else 
       ds.Data = "NOT CHECKED"; 
     } 
    } 

ich nicht hinzugefügt habe der Designer-Code, aber der dort, und das Formular enthält ein TextBox-Objekt und ein CheckBox-Objekt. Wie Sie verstehen, versuche ich, die Textbox-Text-Eigenschaft zu ändern, während der Benutzer die CheckBox abhakt. Dieser Code aktualisiert jedoch nicht die Eigenschaft TextBox Text. Kann mir bitte jemand erklären, was ich vermisse?

Antwort

7

Sie benötigen eine Möglichkeit, WinForms zu benachrichtigen, wenn sich der Wert der Eigenschaft Data ändert. Der einfachste Weg ist, um entweder:

  • ein Ereignis DataSourceClass hinzufügen: public event EventHandler DataChanged;
  • DataSourceClassINotifyPropertyChanged implementieren machen. Dies gibt Ihnen ein PropertyChanged Ereignis.

In beiden Fällen haben Sie ein neues Ereignis, das Sie erhöhen müssen. Sie müssen Ihre Data-Eigenschaft von einer automatischen Eigenschaft in eine mit einem privaten Feld, einer get-Methode und einer set-Methode konvertieren. Sobald Sie einen expliziten Getter und Setter für die Eigenschaft haben, können Sie Ihr Ereignis innerhalb des Setter auslösen.

+0

Ich habe eine Füllung, die mir fehlt die Hauptidee ... Warum muss ich Datenbindung verwenden, wenn ich ein Ereignis hinzufügen muss? Ich könnte nur das Ereignis verwenden (keine ControlBindingsCollection notwendig ...) –

+0

Für ein Beispiel so einfach, Sie könnten nur ein Ereignis haben, das das Textfeld direkt aktualisiert. In einer realen Anwendung möchten Sie jedoch das Datenmodell (Ihre 'DataSourceClass') von der Benutzeroberfläche (dem Textfeld) getrennt halten. Der Zweck der Datenbindung besteht darin, zwischen dem Modell und der Benutzeroberfläche zu sitzen und Daten zwischen ihnen auszutauschen, ohne dass sie sich gegenseitig bewusst machen müssen. –

4

Sie können die Schnittstelle INotifyPropertyChanged verwenden. Ich habe dies nicht über den IDE/Compiler ausgeführt, so dass es einen Syntaxfehler geben könnte.