0

我的代码有问题。我使用列表框和可观察集合将数据添加到列表中。代码如下所示:

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;

但这不是一个好的解决方案,这里有什么问题?

4

2 回答 2

4

ObservableCollection 只会在列表中有活动而不是列表项时通知。列表上的活动意味着添加/删除列表中的项目。您需要对 ListData 类实现 INotifyPropertyChange 接口以通知 ListData 类属性/成员的更改。

于 2012-07-01T11:17:39.420 回答
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"));
        }
    }
}

顺便说一句:我对必须将属性名称作为字符串传递感到不舒服。如需更复杂的解决方案,请参阅本教程

于 2012-07-01T11:34:50.893 回答