【问题标题】:WPF Bindings won't update unless I recreate the entire list?除非我重新创建整个列表,否则 WPF 绑定不会更新?
【发布时间】:2010-11-24 13:18:32
【问题描述】:

背景:

我的 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 按预期填充。

问题:

响应某些用户操作。我编辑FooBars 中的FooBar 对象之一,并调用OnPropertyChanged() 让WPF 知道我想要更新绑定。

FooBars[2].FooBarProperty = "Some new text here";
OnProperChanged("FooBars"); // WPF is not listening to this :(

只有一个问题:这完全行不通。 GridView 永远不会更新。

解决方法:

在多次挠头(以及敲桌子和咒骂)之后,我想出了上面的替代品:

FooBars[2].FooBarProperty = "Some new text here";
FooBars = FooBars.Select(fb => fb).ToList(); // this works but why is it necessary?

就像一个魅力,但我为什么需要这样做?

注意:我尝试从 List&lt;FooBar&gt; 切换到 ObservableCollection&lt;FooBar&gt;,但这完全没有区别。

我的问题:

很简单,为什么我需要这个基本上将列表复制到自身中以更新绑定的疯狂代码?

有没有更好的方法来强制更新?

谢谢。

编辑——最终解决方案:

感谢@Botz3000 在下面的回答,我将FooBars 切换回ObservableCollection&lt;FooBar&gt;,并修改了FooBar,因此它实现了INotifyChanged。一切正常,无需复制奇怪的列表。

【问题讨论】:

    标签: wpf data-binding xaml mvvm binding


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 2015-09-26
      • 2015-03-09
      • 1970-01-01
      • 2023-03-24
      • 2021-08-23
      相关资源
      最近更新 更多