假设我有一个名为X的全局变量INT。由于X是全局的,我们可以假定任何东西都可以修改它的值,因此它会被不断地改变。
假设我有一个名为"label"的Label控件。这是我想要实现的目标:
我想要将label.Text的值与变量X "绑定"起来。以这样的方式,当变量X被更改时,它将反映回label.Text。
现在,我不想编写事件监听器并使用委托来完成这个任务(我希望代码量尽可能少)。是否有一种方法可以使用DataBinding组件来完成这个任务?或者其他新技术?
假设我有一个名为X的全局变量INT。由于X是全局的,我们可以假定任何东西都可以修改它的值,因此它会被不断地改变。
假设我有一个名为"label"的Label控件。这是我想要实现的目标:
我想要将label.Text的值与变量X "绑定"起来。以这样的方式,当变量X被更改时,它将反映回label.Text。
现在,我不想编写事件监听器并使用委托来完成这个任务(我希望代码量尽可能少)。是否有一种方法可以使用DataBinding组件来完成这个任务?或者其他新技术?
如果您想使用数据绑定基础结构,并反映对值所做的更改,您需要一种方法来通知UI有关绑定值所做的更改。
因此,最好的方法是使用属性并实现INotifyPropertyChanged
接口,像这样:
class frmFoo : Form, INotifyPropertyChanged
{
private string _foo;
public string Foo
{
get { return _foo; }
set
{
_foo = value;
OnPropertyChanged("Foo");
}
}
protected virtual void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
同时要记得首先在标签上设置绑定:
public frmFoo()
{
InitializeComponent();
lblTest.DataBindings.Add(new Binding("Text", this, "Foo"));
}
对于一个多线程程序(因此几乎所有的Windows Forms程序都是),iCe的答案并不是一个好的答案,因为它无论如何都不能让您改变标签(您会得到一些跨线程错误)。最简单的解决方法是在Setter中创建属性:
private string _labelText;
public string labelText
{
get { return _labelText; }
set
{
_labelText = value;
updateLabelText(_labelText); //setting label to value
}
}
updateLabelText(string)是线程安全的:
delegate void updateLabelTextDelegate(string newText);
private void updateLabelText(string newText)
{
if (label1.InvokeRequired)
{
// this is worker thread
updateLabelTextDelegate del = new updateLabelTextDelegate(updateLabelText);
label1.Invoke(del, new object[] { newText });
}
else
{
// this is UI thread
label1.Text = newText;
}
}
private int _x;
public int X {
get
{
return _x;
}
set
{
_x = value;
label.Text = _x.ToString();
}
}