背景:
我有一个 List<T>
在我的 ViewModel 中定义为...
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
绑定(bind)到这个列表。<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 知道我想要更新绑定(bind)。FooBars[2].FooBarProperty = "Some new text here";
OnProperChanged("FooBars"); // WPF is not listening to this :(
只有一个问题:这完全行不通。
GridView
从不更新。解决方法:
在多次挠头(以及敲 table 和咒骂)之后,我想出了上面的替代品:
FooBars[2].FooBarProperty = "Some new text here";
FooBars = FooBars.Select(fb => fb).ToList(); // this works but why is it necessary?
像魅力一样工作,但为什么我需要这样做?
注意:我尝试从
List<FooBar>
切换至ObservableCollection<FooBar>
,但这完全没有区别。我的问题:
很简单,为什么我需要这个基本上将列表复制到自身以更新绑定(bind)的疯狂代码?
有没有更好的方法来强制更新?
谢谢。
编辑——最终解决方案:
感谢@Botz3000 下面的回答,我切换了
FooBars
返回 ObservableCollection<FooBar>
, 我修改了 FooBar
所以它实现了INotifyChanged
.一切都按预期工作,不需要奇怪的列表复制。
最佳答案
如果您不更改存储在 ObservableCollection
中的对象,本身,而是它的属性,则不会触发 CollectionChanged 事件。
您的 FooBarProperty
需要一个 PropertyChanged("FooBarProperty")
, 也。由于列表项绑定(bind)到此属性,因此它们需要通知。
关于除非我重新创建整个列表,否则 WPF 绑定(bind)不会更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1360844/