2011-02-08 23 views
6

Tôi có một đối tượng thực hiện INotifyPropertyChanged và hộp kiểm bị ràng buộc vào thuộc tính boolean của đối tượng đó. Điều này làm việc, nhưng tôi đã thấy rằng khi tôi kiểm tra hoặc bỏ chọn hộp kiểm, thuộc tính bị ràng buộc của đối tượng không được cập nhật cho đến khi tôi nhấp vào điều khiển khác, đóng biểu mẫu hoặc làm cho hộp kiểm mất tiêu điểm.Bắt buộc hộp kiểm Windows Forms bị ràng buộc dữ liệu để thay đổi giá trị thuộc tính ngay lập tức khi được bấm

Tôi muốn hộp kiểm này có hiệu lực ngay lập tức. Đó là, khi tôi chọn hộp, thuộc tính phải được đặt ngay lập tức và khi tôi bỏ chọn hộp, nó sẽ được đặt ngay lập tức sai.

Tôi đã giải quyết vấn đề này bằng cách thêm trình xử lý cho sự kiện CheckedChanged của hộp kiểm, nhưng có một "cách đúng" để thực hiện việc này mà tôi đã bỏ qua không?


Một Stack Overflow câu hỏi tương tự là Databound value of textbox/checkbox is incorrect until textbox/checkbox is validated.

Trả lời

6

Đặt chế độ ràng buộc của bạn để OnPropertyChanged:

this.objectTestBindingSource = new System.Windows.Forms.BindingSource(this.components); 
this.objectTestBindingSource.DataSource = typeof(WindowsFormsApplication1.ObjectTest); 

this.checkBox1.DataBindings.Add(
    new System.Windows.Forms.Binding(
    "Checked", 
    this.objectTestBindingSource, 
    "SomeValue", 
    true, 
    System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); 

public class ObjectTest: System.ComponentModel.INotifyPropertyChanged 
{ 
    public bool SomeValue 
    { 
     get { return _SomeValue; } 
     set { _SomeValue = value; OnPropertyChanged("SomeValue"); } 
    } 

    private bool _SomeValue; 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string name) 
    { 
     if (string.IsNullOrEmpty(name)) { 
      throw new ArgumentNullException("name"); 
     } 

     if (PropertyChanged != null) { 
      PropertyChanged.Invoke(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    ObjectTest t = new ObjectTest(); 
    this.objectTestBindingSource.Add(t); 
} 

này hoạt động ngay sau khi tôi bấm vào hộp.

Các vấn đề liên quan