2009-05-06 7 views
1

Ich bin ein bisschen mit Databinding in einem Tryout Projekt stecken zu spielen. Ich habe ein einfaches Formular mit nur einem Drehfeld, die ich an ein Mitglied der Form binden möchten.VS2008 Zwei-Wege-Datenbindung: wie man es an der Arbeit?

class Form1 { 
    public class Data : System.ComponentModel.INotifyPropertyChanged { 
     int _value = 10; 
     public int value {get;set;} 
     public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

    } 

    public Data data; // the member I want to bind to 

} 

In dem VS IDE, der Abschnitt Datum in den Eigenschaften meiner Spin-Box ermöglicht es mir Form1.data als Datenquelle auszuwählen, aber

  1. die Spinnbox mit 10 nicht initialisiert wird, wie ich erwarten würde
  2. Ändern der Spinbox-Wert nicht die Get/Set von Data.value.

Und ich kann einfach nicht damit leben. Irgendwelche Ideen?

Antwort

1

Für Objekt => Steuer Updates: Ihre Veranstaltung wird nicht angehoben werden - automatisch implementiert Eigenschaften kümmern sich nicht um INotifyPropertyChanged - Sie werden es ausziehen müssen:

public class Data : INotifyPropertyChanged { 
    int _value = 10; 
    public int Value { 
     get {return _value;} 
     set { 
      if(value != _value) { 
       _value = value; 
       OnPropertyChanged("Value"); 
      } 
     } 
    } 
    protected virtual void OnPropertyChanged(string propertyName) { 
     var handler = PropertyChanged; 
     if(handler != null) { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
} 

Aber für die anderen (Kontroll => Objekt), ich erwarte, dass Sie nicht über die Bindung richtig eingerichtet haben. Sie sollten auf die Data.Value Eigenschaft bindend sein, und Sie werden ihm über Ihre Data Instanz zur Laufzeit sagen müssen:

someBindingSource.DataSource = data; 

Oder wenn Sie DataBindings direkt verwenden - folgende zeigt es mit der oben genannten Art arbeiten:

static class Program { 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 

     Data data = new Data(); 
     data.PropertyChanged += delegate { 
      Debug.WriteLine("Value changed: " + data.Value); 
     }; 
     Button btn; 
     NumericUpDown nud; 
     Form form = new Form { 
      Controls = { 
       (nud = new NumericUpDown()), 
       (btn = new Button { 
        Text = "Obj->Control", 
        Dock = DockStyle.Bottom }) 
      } 
     }; 
     nud.DataBindings.Add("Value", data, "Value", 
         false, DataSourceUpdateMode.OnPropertyChanged); 
     btn.Click += delegate { data.Value++; }; 
     Application.Run(form); 
    } 
} 
Verwandte Themen