2

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

这可以正常工作并更新 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); 
    }
}

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

更新:我需要澄清的一件事DataManager.Data.WorkersObservableCollection.

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

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

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

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

没有 LINQ:

在此处输入图像描述

使用 LINQ:

在此处输入图像描述

在此处输入图像描述

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

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

4

2 回答 2

1

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

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

肯定有几种方法,例如过滤 ObservableCollection?对 ObservableCollection 进行排序和过滤。但没有什么比在上面扔一个简单的 LINQ 更容易的了。或者Reactive Extensions可以在这里为您提供帮助。但我从未使用过它,所以我不知道设置过滤可观察集合有多容易。

于 2013-07-20T19:05:46.247 回答
0

尝试在 Where 子句的末尾添加 .ToList() 。

return DataManager.Data.Workers.Where(w => w.Gender == Gender.Male).ToList(); 

不允许绑定到方法,所以可能发生的是您绑定到 Count 属性而不是方法。List 包含 Count 属性,而 IEnumerable 不包含。

于 2013-07-19T20:57:02.267 回答