2014-11-14 73 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事件触发。任何已注册到该事件的对象都可以用它们自己的方式处理它。

相关问题