mvvm - PropertyChanged没有用列表修改来更新GUI,但是如果我分配一个新列表 - C#silverlight

Jea*_*rin 2 c# data-binding silverlight events mvvm

我的ViewModel包含一个List<string> SelectedActions和一个方法AddSelectedAction(string addMe)
如果我有以下代码,GUI在调用方法时不会更新:

SelectedActions.Add(addMe);
OnPropertyChanged("SelectedActions");
Run Code Online (Sandbox Code Playgroud)

但如果我使用它,那么它的工作原理:

SelectedActions.Add(addMe);
List<string> li = new List<string>();
foreach (string st in SelectedActions)
li.Add(st);
SelectedActions = li;
OnPropertyChanged("SelectedActions");
Run Code Online (Sandbox Code Playgroud)

我在哪里有以下效用函数

protected void OnPropertyChanged(string propertyName)
{
  this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
Run Code Online (Sandbox Code Playgroud)

除了实现INotifyPropertyChanged
Note我发布的代码有效,如果我删除了OnPropertyChanged调用,所以我知道它至少在做某事

Ala*_*tts 5

我建议改变你List<string>ObservableCollection<string>.这是存储在更新/更改时需要通知的集合的标准/推荐方式.

这将为您处理所有更改通知,您无需显式调用 OnPropertyChange()


Mat*_*eer 5

那是因为给出的对象SelectedActions正在进行小的优化.你告诉它属性已经改变了,但它快速调用了Equals()并发现它仍然是同一个对象,所以它会短路更新值.当您为SelectedActions分配新列表时,控件会看到它是一个全新的对象,因此会进行更新.

最简单的解决方法是使用一个ObservableCollection实现的INotifyCollectionChanged,这是用于处理这种情况的接口.