除非重新创建整个列表,否则WPF绑定不会更新?

时间:2009-09-01 06:32:19

标签: wpf data-binding xaml mvvm binding

背景

我的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。一切都按照预期工作,不需要复制奇怪的列表。

1 个答案:

答案 0 :(得分:3)

如果您没有更改存储在ObservableCollection本身中的对象,而是更改它的属性,则不会触发CollectionChanged事件。

您的FooBarProperty也需要PropertyChanged("FooBarProperty")。由于列表项绑定到此属性,因此它们将需要通知。