2012-01-11 92 views
2

我有一個UserControl,它有一個Textbox,Button和一個Tooltip控件。它實現INotifyPropertyChanged我試圖覆蓋文本屬性並添加我自己的屬性,但在所有情況下,控件從綁定的數據源讀取罰款,但從不更新數據源。文字改變時會引發我的事件。一些代碼如下。所有其他標準控件工作正常。當用戶輸入或更改值時,需要什麼來獲取控件來更新數據源?Bound UserControl沒有更新數據源

public partial class UrlControl : UserControl, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    [Bindable(true)] 
    [Browsable(true)] 
    public string Url 
    { 
     get 
     { 
      return url.Text; 
     } 
     set 
     { 
      if (value != url.Text) 
      { 
       url.Text = value; 
       OnPropertyChanged("Url"); 
      } 
     } 
    } 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
    } 

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, e); 
     } 
    } 

這是表單設計器的綁定代碼。

this.urlControl1.DataBindings.Add(new System.Windows.Forms.Binding("Url", this.customerBindingSource, "First", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); 

} 
+0

是真的Windows窗體?你正在談論'INotifiedPropertyChanged' ... – Tigran 2012-01-11 21:13:06

+0

,並把代碼放在你實際綁定到數據的地方...... – Tigran 2012-01-11 21:14:35

+0

你有使用中間屬性的特殊原因嗎?你可以直接將'url'文本框的Text屬性綁定到綁定源的'First'屬性上。 – Reddog 2012-01-11 21:44:24

回答

4

INotifyPropertyChanged用於數據源。它允許您的數據源通知綁定控件和其他聽衆屬性更改。但是,控制自己使用不同的機制。這有點奇怪:您使用命名約定<PropertyName>Changed在控件上創建事件。當一個屬性的值發生變化時,您將引發相關的事件。

例子:

public string Url 
{ 
    get { return url.Text; } 
    set 
    { 
     if (value != url.Text) 
     { 
      url.Text = value; 
      OnUrlChanged(); // raise event 
     } 
    } 
} 

public event EventHandler UrlChanged; 

private void OnUrlChanged() 
{ 
    // raise the UrlChanged event 
    if (UrlChanged != null) 
     UrlChanged(this, new EventArgs()); 
} 

這就是所有你需要做的。 Databinding Fairies會在創建綁定時看到該事件並將其掛起。

這裏的MSDN上的題目:How to: Apply the PropertyNameChanged Pattern

1

這應該從數據源讀取值工作。

但是,當將值寫入數據源時,它看起來像是直接從url文本框中存儲並獲取Url值。但是,當用戶界面中的文本框文本發生更改時,您不會引發屬性更改通知。爲了解決這個問題,添加上一個文本框TextChanged事件處理程序,它可以簡單的調用:

void url_TextChanged(object sender, EventArgs e) 
{ 
    OnPropertyChanged("Url"); 
    OnUrlChanged(); // See additional note below 
} 

作爲一個方面,雖然實施INotifyPropertyChanged應該工作......當涉及到Windows窗體上綁定你也可以創建與後綴屬性名的事件「改變」和結合應該注意的是:

public event EventHandler UrlChanged; 

protected virtual void OnUrlChanged() 
{ 
    var handler = UrlChanged; 
    if (handler != null) 
    { 
     handler(this, EventArgs.Empty); 
    } 
} 

[Bindable(true)] 
[Browsable(true)] 
public string Url 
{ 
    get 
    { 
     return url.Text; 
    } 
    set 
    { 
     if (value != url.Text) 
     { 
      url.Text = value; 
      OnPropertyChanged("Url"); 
      OnUrlChanged(); 
     } 
    } 
}