首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > CAD教程 >

关于嵌套的 ObservableCollection<T>集合数据源改变不能更新UI有关问题

2012-07-29 
关于嵌套的 ObservableCollectionT集合数据源改变不能更新UI问题?如题!不知道大家有没有碰到这样的问题,

关于嵌套的 ObservableCollection<T>集合数据源改变不能更新UI问题?
如题!不知道大家有没有碰到这样的问题,这里如果是做集合的增、删嵌套的 ObservableCollection<T>集合数据源,UI是可以更新的,但是如果只是做修改的话,嵌套的 ObservableCollection<T>集合数据源改变了,但不能更新UI。我试过非嵌套的ObservableCollection<T>数据源增、删、修改,数据源都可以即时通知UI.不知道是怎么回事?
Treeview的HierarchicalDataTemplate集合数据绑定源,这里以冷大侠的一篇文章说吧,http://blog.csdn.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更新的

热点排行