我的代码有问题。我使用列表框和可观察集合将数据添加到列表中。代码如下所示:
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);
}
现在,我有一个按钮,例如,更改actualData
,但我无法看到列表中的更改。
按钮看起来像:
private void button1_Click(object sender, RoutedEventArgs e)
{
actualData.first = "12";
}
我找到了解决方法:
listbox1.ItemsSource = null;
listbox1.ItemsSource = data;
但这不是一个好的解决方案,这里有什么问题?
答案 0 :(得分:4)
ObservableCollection只会在列表中有活动时通知,而不会在列表中的项目上通知。列表上的活动意味着添加/删除列表中的项目。您需要为ListData类实现INotifyPropertyChange接口,以通知ListData类属性/成员中的更改。
答案 1 :(得分:3)
正如ZafarYousafi在答案中正确说明的那样,ObservableCollection<T>
只会通知添加和删除项目列表;如果您更改其中一个项目的属性,则不会在列表中更新。
相反,您需要更改ListData
类的定义,如下所示:
public class ListData : INotifyPropertyChanged
这要求您的班级实施PropertyChanged
事件:
public event PropertyChangedEventHandler PropertyChanged;
现在,您需要做的就是更改first
的定义(编码约定规定属性应以大写字母PascalCase
开头):
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"));
}
}
}
顺便说一下:我觉得不得不把属性名称作为字符串传递。有关更复杂的解决方案,请参阅this tutorial。