C# Wpf:我怎么知道TreeView是否更新了?
我使用的是Wpf树视图,在这里我可以动态添加树视图项。 有没有办法知道树何时更新?我尝试了使用TreeView绑定的CollectionChanged事件ObservableCollection,但并没有成功 编辑: 我的代码如下所示:C# Wpf:我怎么知道TreeView是否更新了?,c#,wpf,events,treeview,C#,Wpf,Events,Treeview,我使用的是Wpf树视图,在这里我可以动态添加树视图项。 有没有办法知道树何时更新?我尝试了使用TreeView绑定的CollectionChanged事件ObservableCollection,但并没有成功 编辑: 我的代码如下所示: class Temp { public void Load() { DeriveA d1 = new DeriveA(); DeriveB d2 = new DeriveB(); DeriveB d
class Temp
{
public void Load()
{
DeriveA d1 = new DeriveA();
DeriveB d2 = new DeriveB();
DeriveB d3 = new DeriveB();
DeriveC d4 = new DeriveC();
DeriveC d5 = new DeriveC();
d1.Items.Add(d2);
d1.Items.Add(d3);
d2.Items.Add(d4);
d2.Items.Add(d5);
List = new ObservableCollection<object>();
List.Add(d1);
tree.ItemsSource = List;
DeriveC d6 = new DeriveC();
d3.Items.Add(d6); //At this point, I want to know that List got updated
}
public ObservableCollection<object> List
{
get;
set;
}
}
class Base
{
ObservableCollection<Base> Items = new ObservableCollection<Base>();
}
class DeriveA : Base
{
}
class DeriveB : Base
{
}
class DeriveC : Base
{
}
private void Loaded()
{
MyTreeNode d1 = new MyTreeNode();
MyTreeNode d2 = new MyTreeNode();
MyTreeNode d3 = new MyTreeNode();
MyTreeNode d4 = new MyTreeNode();
MyTreeNode d5 = new MyTreeNode();
d1.AddNode(d2);
d1.AddNode(d3);
d2.AddNode(d4);
d2.AddNode(d5);
d1.CollectionChanged += (s, e) =>
{
MessageBox.Show("Tree Changed");
};
MyTreeNode d6 = new MyTreeNode();
d3.AddNode(d6);
}
public class MyTreeNode : ObservableCollection<MyTreeNode>
{
public void AddNode(MyTreeNode node)
{
this.Add(node);
node.CollectionChanged += (s, e) => this.OnCollectionChanged(e);
}
}
class-Temp
{
公共空荷载()
{
DeriveA d1=新的DeriveA();
DeriveB d2=新的DeriveB();
DeriveB d3=新的DeriveB();
DeriveC d4=新的DeriveC();
DeriveC d5=新的DeriveC();
d1.增加项目(d2);
d1.增加的项目(d3);
d2.项目。添加(d4);
d2.增加项目(d5);
列表=新的ObservableCollection();
列表。添加(d1);
tree.ItemsSource=列表;
DeriveC d6=新的DeriveC();
d3.Items.Add(d6);//此时,我想知道列表已更新
}
公共可观测收集列表
{
得到;
设置
}
}
阶级基础
{
ObservableCollection Items=新的ObservableCollection();
}
DeriveA类:基
{
}
派生类B:基
{
}
类DeriveC:Base
{
}
如何查找列表属性在任何级别更新的时间?事件如何
编辑 SourceUpdate事件未触发,但我尝试了ObservaleCollection.CollectionChanged,它没有问题,因此我想请您提供一些代码,以下是我测试过的内容,希望能有所帮助:
public partial class Window1 : Window
{
ObservableCollection<string> items = new ObservableCollection<string>()
{
"string1","string2","string3","string4","string5"
};
public Window1()
{
InitializeComponent();
DataContext = this;
tree.ItemsSource = items;
items.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(items_CollectionChanged);
}
void items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
MessageBox.Show("Event raised");
}
private void btnAddItem_Click(object sender, RoutedEventArgs e)
{
items.Add("string6");
}
}
公共部分类窗口1:窗口
{
ObservableCollection项=新的ObservableCollection()
{
“string1”、“string2”、“string3”、“string4”、“string5”
};
公共窗口1()
{
初始化组件();
DataContext=this;
tree.ItemsSource=项目;
items.CollectionChanged+=新系统.Collections.Specialized.NotifyCollectionChangedEventHandler(items\u CollectionChanged);
}
无效项\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
MessageBox.Show(“引发的事件”);
}
私有void btnAddItem_单击(对象发送者,路由目标e)
{
项目。添加(“第6条”);
}
}
还有xaml
<StackPanel Orientation="Vertical">
<TreeView x:Name="tree" />
<Button x:Name="btnAddItem" Click="btnAddItem_Click" Content="AddItem" />
</StackPanel>
这件事怎么办
编辑 SourceUpdate事件未触发,但我尝试了ObservaleCollection.CollectionChanged,它没有问题,因此我想请您提供一些代码,以下是我测试过的内容,希望能有所帮助:
public partial class Window1 : Window
{
ObservableCollection<string> items = new ObservableCollection<string>()
{
"string1","string2","string3","string4","string5"
};
public Window1()
{
InitializeComponent();
DataContext = this;
tree.ItemsSource = items;
items.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(items_CollectionChanged);
}
void items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
MessageBox.Show("Event raised");
}
private void btnAddItem_Click(object sender, RoutedEventArgs e)
{
items.Add("string6");
}
}
公共部分类窗口1:窗口
{
ObservableCollection项=新的ObservableCollection()
{
“string1”、“string2”、“string3”、“string4”、“string5”
};
公共窗口1()
{
初始化组件();
DataContext=this;
tree.ItemsSource=项目;
items.CollectionChanged+=新系统.Collections.Specialized.NotifyCollectionChangedEventHandler(items\u CollectionChanged);
}
无效项\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
MessageBox.Show(“引发的事件”);
}
私有void btnAddItem_单击(对象发送者,路由目标e)
{
项目。添加(“第6条”);
}
}
还有xaml
<StackPanel Orientation="Vertical">
<TreeView x:Name="tree" />
<Button x:Name="btnAddItem" Click="btnAddItem_Click" Content="AddItem" />
</StackPanel>
您可以有如下内容:
class Temp
{
public void Load()
{
DeriveA d1 = new DeriveA();
DeriveB d2 = new DeriveB();
DeriveB d3 = new DeriveB();
DeriveC d4 = new DeriveC();
DeriveC d5 = new DeriveC();
d1.Items.Add(d2);
d1.Items.Add(d3);
d2.Items.Add(d4);
d2.Items.Add(d5);
List = new ObservableCollection<object>();
List.Add(d1);
tree.ItemsSource = List;
DeriveC d6 = new DeriveC();
d3.Items.Add(d6); //At this point, I want to know that List got updated
}
public ObservableCollection<object> List
{
get;
set;
}
}
class Base
{
ObservableCollection<Base> Items = new ObservableCollection<Base>();
}
class DeriveA : Base
{
}
class DeriveB : Base
{
}
class DeriveC : Base
{
}
private void Loaded()
{
MyTreeNode d1 = new MyTreeNode();
MyTreeNode d2 = new MyTreeNode();
MyTreeNode d3 = new MyTreeNode();
MyTreeNode d4 = new MyTreeNode();
MyTreeNode d5 = new MyTreeNode();
d1.AddNode(d2);
d1.AddNode(d3);
d2.AddNode(d4);
d2.AddNode(d5);
d1.CollectionChanged += (s, e) =>
{
MessageBox.Show("Tree Changed");
};
MyTreeNode d6 = new MyTreeNode();
d3.AddNode(d6);
}
public class MyTreeNode : ObservableCollection<MyTreeNode>
{
public void AddNode(MyTreeNode node)
{
this.Add(node);
node.CollectionChanged += (s, e) => this.OnCollectionChanged(e);
}
}
private void Loaded()
{
MyTreeNode d1=新MyTreeNode();
MyTreeNode d2=新MyTreeNode();
MyTreeNode d3=新MyTreeNode();
MyTreeNode d4=新MyTreeNode();
MyTreeNode d5=新MyTreeNode();
d1.添加节点(d2);
d1.添加节点(d3);
d2.添加节点(d4);
d2.添加节点(d5);
d1.CollectionChanged+=(s,e)=>
{
MessageBox.Show(“树已更改”);
};
MyTreeNode d6=新MyTreeNode();
d3.添加节点(d6);
}
公共类MyTreeNode:可观测集合
{
公共void AddNode(MyTreeNode节点)
{
添加(节点);
node.CollectionChanged+=(s,e)=>this.OnCollectionChanged(e);
}
}
您可以有如下内容:
class Temp
{
public void Load()
{
DeriveA d1 = new DeriveA();
DeriveB d2 = new DeriveB();
DeriveB d3 = new DeriveB();
DeriveC d4 = new DeriveC();
DeriveC d5 = new DeriveC();
d1.Items.Add(d2);
d1.Items.Add(d3);
d2.Items.Add(d4);
d2.Items.Add(d5);
List = new ObservableCollection<object>();
List.Add(d1);
tree.ItemsSource = List;
DeriveC d6 = new DeriveC();
d3.Items.Add(d6); //At this point, I want to know that List got updated
}
public ObservableCollection<object> List
{
get;
set;
}
}
class Base
{
ObservableCollection<Base> Items = new ObservableCollection<Base>();
}
class DeriveA : Base
{
}
class DeriveB : Base
{
}
class DeriveC : Base
{
}
private void Loaded()
{
MyTreeNode d1 = new MyTreeNode();
MyTreeNode d2 = new MyTreeNode();
MyTreeNode d3 = new MyTreeNode();
MyTreeNode d4 = new MyTreeNode();
MyTreeNode d5 = new MyTreeNode();
d1.AddNode(d2);
d1.AddNode(d3);
d2.AddNode(d4);
d2.AddNode(d5);
d1.CollectionChanged += (s, e) =>
{
MessageBox.Show("Tree Changed");
};
MyTreeNode d6 = new MyTreeNode();
d3.AddNode(d6);
}
public class MyTreeNode : ObservableCollection<MyTreeNode>
{
public void AddNode(MyTreeNode node)
{
this.Add(node);
node.CollectionChanged += (s, e) => this.OnCollectionChanged(e);
}
}
private void Loaded()
{
MyTreeNode d1=新MyTreeNode();
MyTreeNode d2=新MyTreeNode();
MyTreeNode d3=新MyTreeNode();
MyTreeNode d4=新MyTreeNode();
MyTreeNode d5=新MyTreeNode();
d1.添加节点(d2);
d1.添加节点(d3);
d2.添加节点(d4);
d2.添加节点(d5);
d1.CollectionChanged+=(s,e)=>
{
MessageBox.Show(“树已更改”);
};
MyTreeNode d6=新MyTreeNode();
d3.添加节点(d6);
}
公共类MyTreeNode:可观测集合
{
公共void AddNode(MyTreeNode节点)
{
添加(节点);
node.CollectionChanged+=(s,e)=>this.OnCollectionChanged(e);
}
}
它不起作用,无论如何,谢谢您的回复!还有什么吗?我不知道您是否订阅了CollectionChangedEvent,请尝试List.CollectionChanged+=new System.Collections.Specialized.NotifyCollectionChangedEventHandler(List\u CollectionChanged);和void List_CollectionChanged(对象发送方,System.Collections.Specialized.notifycollectionchangedventargs e){MessageBox.Show(“引发的事件”);}它不工作,无论如何,感谢回复!还有什么吗?我不知道您是否订阅了CollectionChangedEvent,请尝试List.CollectionChanged+=new System.Collections.Specialized.NotifyCollectionChangedEventHandler(List\u CollectionChanged);和无效列表_CollectionChanged(对象发送方,System.Collections.Specialized.notifycollectionchangedventargs e){MessageBox.Show(“引发的事件”);}