Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的ObservableCollection没有在列表框中刷新?_C#_Silverlight_Windows Phone 7 - Fatal编程技术网

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"));
        }
    }
}