为什么我的ObservableCollection没有在ListBox中刷新?

时间:2012-07-01 11:09:27

标签: c# silverlight windows-phone-7

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

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;

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

2 个答案:

答案 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