2008-11-26 18 views
1

我在C#中編寫了一個從System.Windows.Forms.Control派生的控件。我添加了一個屬性,選擇要綁定到使用BindingSource的業務實體的數據綁定。.NET數據綁定忽略屬性更改

我已經實現了PropertyNameChanged模式,通過添加一個SelectedChanged事件,當Selected屬性更改時,我會觸發它。

這是我的代碼:

public partial class RateControl : Control 
{ 
    [Category("Property Changed")] 
    public event EventHandler SelectedChanged; 

    public int Selected 
    { 
     get 
     { return m_selected; } 
     set 
     { 
     if (m_selected != value) 
     { 
      m_selected = value; 
      OnSelectedChanged(); 
      Invalidate(); 
     } 
     } 
    } 

    protected virtual void OnSelectedChanged() 
    { 
     if (this.SelectedChanged != null) 
     this.SelectedChanged(this, new EventArgs()); 
    } 
} 

當我綁定到選定的財產,我看到事件被subscibed來。當物業發生變化時,該事件也會被解僱。

但是,業務實體未更新。我甚至沒有看到被訪問的Selected屬性的getter。

我錯過了什麼?

回答

1

你有綁定的更新模式設置爲DataSourceUpdateMode.OnPropertyChanged?通過binding.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;或使用DataBindings.Add(...)重載之一。

以下作品我值推到業務對象...

using System; 
using System.Diagnostics; 
using System.Windows.Forms; 

class MyForm : Form 
{ 
    public MyForm() 
    { 
     MyBusinessObject obj = new MyBusinessObject(); 
     Button btn = new Button(); 
     btn.Click += delegate { Foo++; }; 
     DataBindings.Add("Foo", obj, "Bar", false, DataSourceUpdateMode.OnPropertyChanged); 
     DataBindings.Add("Text", obj, "Bar"); 
     Controls.Add(btn); 
    } 

    private int foo; 
    public event EventHandler FooChanged; 
    public int Foo 
    { 
     get { return foo; } 
     set 
     { 
      if (foo != value) 
      { 
       foo = value; 
       Debug.WriteLine("Foo changed to " + foo); 
       if (FooChanged != null) FooChanged(this, EventArgs.Empty); 
      } 
     } 
    } 
} 

class MyBusinessObject 
{ 
    private int bar; 
    public event EventHandler BarChanged; 
    public int Bar 
    { 
     get { return bar; } 
     set 
     { 
      if (bar != value) 
      { 
       bar = value; 
       Debug.WriteLine("Bar changed to " + bar); 
       if (BarChanged != null) BarChanged(this, EventArgs.Empty); 
      } 
     } 
    } 
} 

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.Run(new MyForm()); 
    } 
}