gpt4 book ai didi

c# - IEnumerable 属性中的 LINQ 过滤会破坏绑定(bind)

转载 作者:太空宇宙 更新时间:2023-11-03 13:39:12 24 4
gpt4 key购买 nike

我的 UI 中有一个 TextBlock 绑定(bind)到属性的 .Count() 扩展。我想向该属性添加 LINQ 过滤,但这样做会破坏绑定(bind)。

这可以毫无问题地更新 UI:

public IEnumerable<Worker> WorkersTest
{
get
{
return DataManager.Data.Workers;
}
}

添加 LINQ 过滤后,WorkersTest 不会更新 TextBlock,尽管 MessageBox 确认该属性正在被修改。但是,在数据初始化后,值会正确显示:

public IEnumerable<Worker> WorkersTest
{
get
{
return DataManager.Data.Workers.Where(w => w.Gender == Gender.Male);
}
}

有没有办法在不破坏绑定(bind)的情况下保持 LINQ 过滤?

更新:我需要澄清的一件事是 DataManager.Data.Workers 是一个 ObservableCollection

据我所知,任何 LINQ 操作都会破坏绑定(bind),但 AsEnumerable() 除外,它没有任何效果。

此外,根据 Andres 的回答,Count() 不是问题所在。如果我将此属性绑定(bind)到 DataGrid,我会得到相同的结果。使用 LINQ,它不会更新。没有 LINQ,它确实如此。是否有任何解决方法,最好是不涉及 ICollectionView 或任何类似性质的解决方法?

更新:有人知道 Where 等 LINQ 扩展在使用时是否返回新对象吗?我无法在网上找到任何关于此的文档。但是,如果是这种情况,那可能就是问题所在。

更新:我插入了一个断点,发现了一些可能有用的有趣信息:

没有 LINQ:

enter image description here

使用 LINQ:

enter image description here

enter image description here

也许这可以阐明真正发生的事情,并希望让我更接近解决方案。

我假设 CollectionChangedPropertyChanged 为 null 是问题的根源是否正确?如果是这样,我该怎么做才能解决这个问题?

最佳答案

您的问题源于不了解可观察的集合。 DataManager.Data.WorkersObservableCollection 或类似的东西。这意味着,它会在添加/删除项目时引发事件。 UI 然后可以监听这些事件并适本地更新。

LINQ 对可观察集合一无所知。它只是读取数据并将其转换为新的集合,一次,一种方式。所以使用 LINQ 进行过滤是行不通的。或者至少不是没有某种黑客攻击。

肯定有几种方法,比如Filtering an ObservableCollection?Sorts and filters on ObservableCollection .但没有什么比在其上添加一个简单的 LINQ 更简单的了。或者也许 Reactive Extensions可以在这里帮助你。但我从未使用过它,所以我不知道设置过滤可观察集合有多容易。

关于c# - IEnumerable 属性中的 LINQ 过滤会破坏绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17755196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com