C# 为什么我的ObservableCollection没有在列表框中刷新?
我的代码有问题。我使用一个列表框和一个可观察的集合将数据添加到列表中。代码如下所示:C# 为什么我的ObservableCollection没有在列表框中刷新?,c#,silverlight,windows-phone-7,C#,Silverlight,Windows Phone 7,我的代码有问题。我使用一个列表框和一个可观察的集合将数据添加到列表中。代码如下所示: ListData actualData; ObservableCollection<ListData> data; public Calculate() { InitializeComponent(); data = new ObservableCollection<ListData>(); newData(); listbox1.ItemsSour
ListData actualData;
ObservableCollection<ListData> data;
public Calculate()
{
InitializeComponent();
data = new ObservableCollection<ListData>();
newData();
listbox1.ItemsSource = data;
}
private void newData()
{
actualData = new ListData("1", "2", "3");
data.Add(actualData);
}
我找到了一个解决办法:
listbox1.ItemsSource = null;
listbox1.ItemsSource = data;
但这不是一个好的解决方案,这里有什么问题?ObservableCollection只会在列表上有活动而不是列表项上有活动时发出通知。列表上的活动意味着添加/删除列表中的项目。您需要实现ListData类的INotifyPropertyChange接口,以通知ListData类属性/成员的更改。正如ZafarYousafi在其回答中正确指出的那样,
ObservableCollection
将只通知添加和删除项的列表;如果更改其中一个项目的属性,该属性将不会在列表中更新
相反,您需要更改ListData
类的定义,如下所示:
public class ListData : INotifyPropertyChanged
这要求类实现PropertyChanged
事件:
public event PropertyChangedEventHandler PropertyChanged;
现在,您需要做的就是首先更改的定义(编码惯例规定属性应以大写字母开头,PascalCase
):
顺便说一下:我对不得不以字符串形式传入属性名感到不舒服。有关更复杂的解决方案,请参见。INotifyPropertyChanged也可以工作-我开始想知道区别是什么…啊,很明显,它在.NET中被删除了-是的,我的意思是,但是写IPRopretyChange时出错了。没有这样的接口IPropertyChange:)没问题,你从我这里得到+1:DSpot on!我唯一要说的是关于事件调用的注释。这绝对是最佳实践,并不是一个真正有争议的话题。看这个答案:好的;我指的是
public event PropertyChangedEventHandler PropertyChanged;
private string first;
public string First
{
get { return first; }
set
{
first = value;
var handler = PropertyChanged; //according to Essential C# (M. Michaelis)
if (handler != null) //the copy should prevent threading issues
{
handler(this, new PropertyChangedEventArgs("First"));
}
}
}