当属性在内部发生变化时,如何将控件绑定到属性更改?

时间:2014-11-14 14:24:59

标签: c# wpf

我想将控件绑定到实例的属性。但是,此属性将在内部更改,因此INotifyPropertyChanged某种方式不起作用。

例如,我想显示某个容器中当前存在多少元素。所以我的选择是将Count绑定到标签或什么。但即使Count属性已更改为另一个数字,UI也不会更改。

我不想拥有所有内容的包装类,因为包装器不会解决问题的子集。另一个例子是,如果我想知道Timer过期需要多长时间,它会在内部发生变化,我甚至无法使用包装器来帮助我。

那么什么是将控件绑定到任何属性时解决此问题的一般方法?

1 个答案:

答案 0 :(得分:0)

有很多方法。

您可以使用要绑定的控件的数据绑定属性。以下内容应指导您获得更好的答案: 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事件将触发。已注册到该事件的任何对象都可以以自己的方式处理它。