【发布时间】:2013-07-19 20:45:34
【问题描述】:
我的 UI 中有一个 TextBlock 绑定到属性的 .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.Workers 是ObservableCollection。
据我所知,任何 LINQ 操作都会破坏绑定,但 AsEnumerable() 除外,它没有任何效果。
另外,对于 Andres 的回答,Count() 不是问题所在。如果我将此属性绑定到DataGrid,我会得到相同的结果。使用 LINQ,它不会更新。没有 LINQ,它确实如此。是否有任何解决方法,最好是不涉及ICollectionView 或任何类似性质的解决方法?
更新: 有人知道Where 等LINQ 扩展在使用时是否返回新对象?我无法在网上找到任何有关此的文档。但是,如果是这种情况,那可能就是问题所在。
更新:我插入了一个断点,发现了一些可能有用的有趣信息:
没有 LINQ:
使用 LINQ:
也许这可以揭示真正发生的事情,并希望让我更接近解决方案。
假设CollectionChanged 和PropertyChanged 为空是问题的根源,我是否正确?如果是这样,我该怎么做才能解决这个问题?
【问题讨论】:
-
你的绑定模式设置了吗?模式=双向。
-
这会引发 InvalidOperationException。 Count 属性是只读的。
-
Linq 查询将是惰性的,在评估之前它什么都不做,即调用 ToList()。绑定到这样的查询也不是很好。绑定到在 INotifyPropertyChanged 中引发 PropertyChanged 事件的属性:msdn.microsoft.com/en-us/library/… 这将告诉 UI 它需要更新。
-
问题是集合的setter永远不会被调用。
标签: c# linq ienumerable