2009-05-06 24 views
1

我在一個試用項目中玩DataBinding有點困難。我有一個簡單的窗體,只有一個spinbox,我想綁定到窗體的一個成員。VS2008雙向數據綁定:如何讓它工作?

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 

} 

在VS IDE中,我的旋轉框的屬性數據部分允許我選擇Form1.data作爲數據源,但

  1. 紡紗器不與10初始化,如我所料
  2. 更改spinbox值不會觸發Data.value的get/set。

而我只是不能忍受這一點。有任何想法嗎?

回答

1

對於對象=>控制更新:您的活動將不會引發 - 自動實現的屬性不關心INotifyPropertyChanged - 你需要將其遷出:

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; 
} 

但對於其他(控制=> object),我希望你沒有正確的綁定設置。你應該結合的Data.Value屬性,你需要在運行時告訴它你的Data例如:

someBindingSource.DataSource = data; 

或者,如果您是直接使用DataBindings - 下面說明了它與上述類型的工作:

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); 
    } 
}