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

标签 wpf data-binding xaml mvvm binding

背景:

我有一个 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/

相关文章:

c# - 使用 MVVM 时如何使 TextBox 成为 "password box"并显示星星?

c# - 如何通过 XAML 设置 LISTBOX 工具提示

c# - 如何在 WPF 中将 ViewModels 对象数据绑定(bind)为 3DModels

c# - WPF 控件和边距与窗口大小成比例

c# - 如何将 ViewModel 属性绑定(bind)到转换器中的依赖属性

c# - WPF MVVM : Set focus to current selected item in Datagrid on button click

c# - 计算数据网格上的行并将其添加为新列

android - 无法获取简单的 TextView 以使用 Android 数据绑定(bind)

python : append/merge dicts to pandas in a pythonic way

xaml - 状态栏主题仅在重新启动应用程序后更改