前天在公司做项目时遇到了一个问题,头痛了我很长时间。
具体问题不描述了,举个例子:
我想让程序运行中改变ComboBox的ItemsSource中的数据。代码胡乱写了点
看下代码,AData是我遇到的问题,BData是改正后的。
AData和BData唯一的不同点在Change()方法中。
public class Model : INotifyPropertyChanged
{
public List<string> AData { get; set; }
public List<string> BData { get; set; }
//初始化点数据
public Model()
{
AData = new List<string>();
BData = new List<string>();
for (int i = 0; i < 8; i++)
{
AData.Add("AAA" + i);
BData.Add("BBB" + i);
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
//改变数据
public void Change()
{
BData = new List<string>();//关键在这里
AData.Clear(); //唯一的不同点
for (int i = 10; i < 18; i++)
{
AData.Add("AAA" + i);
BData.Add("BBB" + i);
}
OnPropertyChanged("AData");
OnPropertyChanged("BData");
}
}
将AData和BData分别绑定到两个ComboBox的ItemsSource上。程序运行后先看一下两个ComboBox中的数据(一定要点开看看),然后执行Change()方法。
当执行完Changed()方法后,问题来了,绑定AData的那个ComboBox的数据并没有改变,问题很奇怪。执行完OnPropertyChanged("AData");后确实调AData的get方法了。
不知道是我的想法不对,还是我没有理解好,最后重新new出来一个List,却把问题解决了。
ps.还有点要说明的,如果ComboBox不点开,在执行Change后,数据倒是改变了。
不知道大家遇到过这个问题没有,以后进行集合绑定时一定得想清楚,对于AData来说用ObservableCollection<T>估计没有问题了。