你在监听事件的概念上是正确的(这是一个标准的发布者/订阅者模式)。
对于树视图的实际更新,我倾向于有两种方法:AddOrUpdateTreeItem
和RemoveTreeItem
. add 或 update 方法执行它所说的,查找树项(基于路径)并更新它或添加它。当然,如果模型是在创建表单的线程之外的线程上更新的,则需要使用Control.BeginInvoke()
.
如果您在 form_load 或其他地方填充完整的树,这种方法可能会有点慢,因此您可能对初始填充有不同的方法,并使用我在此处描述的概念进行后续更新。
我对列表视图做同样的事情,这是一个典型的例子。添加树项的主要区别在于,您可能需要添加父节点才能添加所请求的节点,这使得它有点递归。试试看。
private void AddOrUpdateListItem(DomainModelObject item)
{
ListViewItem li = lvwListView.Items[GetKey(item)];
if (li == null)
{
li = new ListViewItem
{
Name = GetKey(item),
Tag = item
};
li.SubItems.Add(new ListViewItem.ListViewSubItem());
li.SubItems.Add(new ListViewItem.ListViewSubItem());
li.SubItems.Add(new ListViewItem.ListViewSubItem());
li.ImageIndex = 0;
lvwListView.Items.Add(li);
}
li.Text = [Itemtext];
li.SubItems[1].Text = [Itemtext];
li.SubItems[2].Text = [Itemtext];
li.SubItems[3].Text = [Itemtext];
}
BeginInvoke()
这是一个如何实现的示例:
public class MyForm : Form
{
...
void data_Changed(object sender, DataChangedEventArgs e)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new EventHandler<DataChangedEventArgs>(data_Changed), sender, e);
return;
}
AddOrUpdateListItem(e.DataItem);
}
...
}