2014-11-14 138 views
0

我想要將控件綁定到實例的屬性。然而,這個屬性會改變內部,所以INotifyPropertyChanged不知何故只是不工作。當屬性在內部發生更改時,如何將控件綁定到屬性更改?

例如,我想要顯示某個容器中當前有多少個元素。所以我的選擇是綁定Count標籤或什麼。但即使Count屬性已更改爲另一個數字,UI將不會更改。

我不想爲所有東西包裝類,因爲包裝器不會解決問題的一個子集。另一個例子是如果我想知道定時器到期需要多長時間,它會在內部發生變化,我甚至無法使用包裝來幫助我。

那麼什麼時候解決這個問題的一般方法是什麼將控件綁定到任何屬性?

+0

很高興看到代碼的和平,以瞭解到底是什麼問題。計時器有事件。如果沒有事件或可綁定屬性,那麼您仍然可以調查價值。 – Sinatr 2014-11-14 14:30:51

+0

你看過BindingSource ..嗎? [如何:使用BindingSource和INotifyPropertyChanged接口提高更改通知](http://msdn.microsoft.com/en-us/library/vstudio/ms184414(v = vs.100).aspx) – MethodMan 2014-11-14 14:31:27

回答

0

有很多種方法。

您可以使用要綁定到的控件的databindings屬性。以下應引導您更好地回答: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.databindings(v=vs.110).aspx

(可選)您可以使用自定義事件,只需在具有該控件的窗體上註冊這些事件即可。事件發生時,在必要時處理事件。

例子:

在模型類:

class myModel 
{ 
    public event EventHandler OnNameChanged(object sender, NameChangedEventArgs e); = delegate { }; 

    private _name; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
     _name = value; 

     if (OnNameChanged != null) 
      OnNameChanged(this, new NameChangedEventArgs(value)) 
     } 
    } 
} 

public class NameChangedEventArgs : EventArgs 
{ 
    private _name; 

    public NameChangedEventArgs(string name) { _name = name; } 
    public Name { get { return _name; } } 
} 

然後在你的形式,註冊事件:所以現在

public class form1 
{ 
    private myModel model; 

    public form() 
    { 
     Initialize(); 
    } 

    private void Initialize() 
    { 
     model.OnNameChanged += new EventHandler(model_OnNameChangedEvent); 
    } 

    private void model_OnNamedChangedEvent(object sender, NameChangedEventArgs e) 
    { 
     textbox.text = e.Name; 
    } 
} 

,當model.Name變化,模型的OnNameChanged事件觸發。任何已註冊到該事件的對象都可以用它們自己的方式處理它。

相關問題