背景
我的ViewModel中有List<T>
定义为...
private List<FooBar> _fooBars;
public List<FooBar> FooBars
{
get { return _fooBars; }
set
{
if (value == _fooBars) return;
_fooBars = value;
OnPropertyChanged("FooBars");
}
}
FooBar
定义为......
public class FooBar
{
public string FooBarProperty { get; set; }
// more properties here
}
与此同时,我有GridView
绑定到此列表。
<ListView
ItemsSource="{Binding FooBars}">
<ListView.View>
<GridView
<GridViewColumn
Header="Foo Bar Prop"
DisplayMemberBinding={Binding FooBarProperty} />
<!--more columns here-->
</GridView>
</ListView.View>
</ListView>
我运行我的应用程序,这一切都很棒。我的FooBarProperties按预期填充。
问题:
响应某些用户操作。我编辑 FooBar
中的FooBars
个对象之一,并调用OnPropertyChanged()
让WPF知道我希望绑定更新。
FooBars[2].FooBarProperty = "Some new text here";
OnProperChanged("FooBars"); // WPF is not listening to this :(
只有一个问题:这完全不起作用。 GridView
从不udpates。
解决方法:
经过多次头部刮伤(以及桌子敲打和咒骂)之后,我想出了以上的替代品:
FooBars[2].FooBarProperty = "Some new text here";
FooBars = FooBars.Select(fb => fb).ToList(); // this works but why is it necessary?
像魅力一样,但为什么我需要这样做?
注意:我尝试从List<FooBar>
切换到ObservableCollection<FooBar>
,但这完全没有区别。
我的问题:
很简单,为什么我需要这个疯狂的代码,基本上将列表复制到自身以使我的绑定更新?
是否有更好的方法来强制更新?
感谢。
编辑 - 最终解决方案:
感谢@ Botz3000的回答,我将FooBars
切换回ObservableCollection<FooBar>
,我修改了FooBar
,因此它实现了INotifyChanged
。一切都按照预期工作,不需要复制奇怪的列表。
答案 0 :(得分:3)
如果您没有更改存储在ObservableCollection
本身中的对象,而是更改它的属性,则不会触发CollectionChanged事件。
您的FooBarProperty
也需要PropertyChanged("FooBarProperty")
。由于列表项绑定到此属性,因此它们将需要通知。