我有一个ObservableCollection(Zone类包含一个IsFiltered布尔属性),其中几个项目将IsFiltered属性设置为true。 在少数情况下,我需要单独删除所有过滤器(即将所有ObservableCollection项目的IsFiltered prop设置为false)。
有没有办法以ObservableCollection.Single(LINQ请求)的方式实现这一点,或者我是否必须循环我的ObservableCollection以在所有项目上将此prop设置为false?
感谢您的回答!
答案 0 :(得分:2)
您必须循环但至少将循环限制为需要重置的对象:
foreach(var zone in zones.Where(z => z.IsFiltered))
{
zone.IsFiltered = false;
}
正如其他答案/评论所述,请避免使用Linq进行更新。请参阅Jon Skeet的回答https://stackoverflow.com/a/1160989/1202600 - Linq用于查询,而不是更新。
答案 1 :(得分:1)
我不确定这是否是您正在寻找的,但是C#中的列表获得了ForEach方法,哪种方法可以做到你想要的,所以:
myObservableCollection.ToList().ForEach(x => x.MyFlag = false);
答案 2 :(得分:0)
发表我的想法(因为你还没有接受任何答案 - 请考虑你是否继续前进)
除了迭代'ObservableCollection'之外别无他法。你可以找到API(linq)为你做这件事,但最后它必须迭代所有对象来更新它们的状态。
如果您的集合由其他线程更新,那么您还需要考虑线程安全性(如果在迭代更新IsFiltered时其他线程更新将通过异常)
除非该属性引发“NotifyPropertyChanged”事件,否则更新属性不会反映在绑定的UI中。因此,您的对象应该具有以下内容:
public bool IsFiltered{
get { return _isFiltered; }
set {
if (_isFiltered == value) return; //no need to modify and trigger UI update
_isFiltered = value;
}