换了工作开始搞 WPF,从 WinForm 转过去很不习惯,尤其是其强大的数据绑定,绕来绕去的我已经晕了。
早上想做个小程序,因为 WPF 还不是很熟悉,所以打算用 WinForm来做。
窗口里有个信息输出用的 ListBox ,我想知道的是,如果给 ListBox 绑定了一个 List 格式的数据源后,当 List 内容变化时,ListBox 如何同步更新显示。不知道能不能通过类似 WPF 的 MVVM 来实现或者什么INotifyPropertyChanged之类的。。。
代码如下:
internal class Log
{
private string msg;
public string Msg
{
get { return msg; }
set { msg = value; }
}
}
internal class Worker
{
private List<Log> _log;
public List<Log> Log
{
get
{
if (this._log == null)
{
this._log = new List<Log>();
}
return this._log;
}
}
public void DoWork()
{
this.Log.Clear();
Timer timer = new Timer()
{
Interval = 1000
};
int i = 0;
timer.Tick += (o, e) =>
{
if (i < 20)
{
this.Log.Add(new Log() { Msg = (i++).ToString() });
}
else
{
timer.Stop();
timer.Dispose();
}
};
timer.Start();
}
}
public partial class Form1 : Form
{
private Worker worker;
public Form1()
{
InitializeComponent();
this.worker = new Worker();
//this.logBox.DataSource = this.worker.Log;
//this.logBox.DisplayMember = "Msg";
}
private void Form1_Load(object sender, EventArgs e)
{
worker.DoWork();
}
}
小白求教学
------解决思路----------------------
WPF/Silverlight控件关心的绑定数据源是否现实INotifyCollectionChanged接口,(INotifyCollectionChange接口中定义了CollectionChanged事件)。
winform的BindingSource实现了IBindingList接口,而IBindingList里有个ListChanged事件。貌似winform控件会自动订阅这个事件,然后当列表发生变化时自动更新自己的吧。