关于嵌套的 ObservableCollection集合数据源改变不能更新UI有关问题
关于嵌套的 ObservableCollection<T>集合数据源改变不能更新UI问题?
如题!不知道大家有没有碰到这样的问题,这里如果是做集合的增、删嵌套的 ObservableCollection<T>集合数据源,UI是可以更新的,但是如果只是做修改的话,嵌套的 ObservableCollection<T>集合数据源改变了,但不能更新UI。我试过非嵌套的ObservableCollection<T>数据源增、删、修改,数据源都可以即时通知UI.不知道是怎么回事?
Treeview的HierarchicalDataTemplate集合数据绑定源,这里以冷大侠的一篇文章说吧,http://blog.****.net/jv9/archive/2009/12/12/4989620.aspx,下面是嵌套的 ObservableCollection<T>的数据集合数据结构:
假设我已定义ObservableCollection<Country> countrys=new ObservableCollection<Country> 并添加了2个国家信息。
为了测试这个问题我,添加一个按钮事件,测试改变嵌套的数据集合ObservableCollection<T>能否改变UI
但实际上countrys数据集合已改变,但是Treeview控件UI并没有改变!(如果做remove或add是可以改变UI的)。所以我在修改TreeView中某个节点的值是先把数据源中的相应的项先Remove掉,在Add改变的数据项(虽然可以达到实现修改Treeview中的某节点,但觉得很别扭),不知道大家有没有碰到这样的问题!
------解决方案--------------------
对于ObservableCollection,本来就是只有add或者remove的时候才会通知UI,也就是只有集合项改变的时候才会通知,修改的话其实集合中的被修改对象并没有变,也就是说集合项还是那一项,只是那一项本身的属性变了,如果想让修改也能更新UI,吧Name定义成依赖属性就行了
------解决方案--------------------
如题!不知道大家有没有碰到这样的问题,这里如果是做集合的增、删嵌套的 ObservableCollection<T>集合数据源,UI是可以更新的,但是如果只是做修改的话,嵌套的 ObservableCollection<T>集合数据源改变了,但不能更新UI。我试过非嵌套的ObservableCollection<T>数据源增、删、修改,数据源都可以即时通知UI.不知道是怎么回事?
Treeview的HierarchicalDataTemplate集合数据绑定源,这里以冷大侠的一篇文章说吧,http://blog.****.net/jv9/archive/2009/12/12/4989620.aspx,下面是嵌套的 ObservableCollection<T>的数据集合数据结构:
- C# code
public class Country { public Country() { Provinces = new ObservableCollection<Province>(); } public string Name { get; set; } public ObservableCollection<Province> Provinces { get; set; } } public class Province { public Province() { Citys = new ObservableCollection<City>(); } public string Name{get;set;} public ObservableCollection<City> Citys { get; set; } } public class City { public City() { } public string Name{get;set;} }
假设我已定义ObservableCollection<Country> countrys=new ObservableCollection<Country> 并添加了2个国家信息。
为了测试这个问题我,添加一个按钮事件,测试改变嵌套的数据集合ObservableCollection<T>能否改变UI
- C# code
private void button2_Click(object sender, RoutedEventArgs e) { countrys.FirstOrDefault().Provinces.FirstOrDefault().Name = "我故意修改的"; }
但实际上countrys数据集合已改变,但是Treeview控件UI并没有改变!(如果做remove或add是可以改变UI的)。所以我在修改TreeView中某个节点的值是先把数据源中的相应的项先Remove掉,在Add改变的数据项(虽然可以达到实现修改Treeview中的某节点,但觉得很别扭),不知道大家有没有碰到这样的问题!
------解决方案--------------------
对于ObservableCollection,本来就是只有add或者remove的时候才会通知UI,也就是只有集合项改变的时候才会通知,修改的话其实集合中的被修改对象并没有变,也就是说集合项还是那一项,只是那一项本身的属性变了,如果想让修改也能更新UI,吧Name定义成依赖属性就行了
------解决方案--------------------
- C# code
private void button1_Click(object sender, RoutedEventArgs e) { ListBoxItem item = this.listBox1.SelectedItem as ListBoxItem; Catalog catalog = this.listBox1.SelectedItem as Catalog; int myindex = catalogs.IndexOf(catalog); catalogs[myindex].CatalogName = "我故意修改的!哈哈!!!"; }
------解决方案--------------------
怀疑和ria service有关,我没用过这东西,你可以试下只是定义普通的实体,只有自动属性
- C# code
public class Catalog { public int ID{get;set;} public string CatalogName{get;set;} }
------解决方案--------------------
我之前问的很清楚,实体是不是只有自动属性,然后你告诉我的实体就是那么简单的只有两个自动属性。。。本来这就是问题的关键
ReportPropertyChanged("CatalogName");
这句话是关键,所以如果像你之前定义的那个实体,只有普通属性,是不可能引起UI更新的