WPF ObservableCollection:可以一次修改所有项目上的一个特定属性吗?

时间:2014-03-08 21:29:03

标签: c# wpf linq observablecollection

我有一个ObservableCollection(Zone类包含一个IsFiltered布尔属性),其中几个项目将IsFiltered属性设置为true。 在少数情况下,我需要单独删除所有过滤器(即将所有ObservableCollection项目的IsFiltered prop设置为false)。

有没有办法以ObservableCollection.Single(LINQ请求)的方式实现这一点,或者我是否必须循环我的ObservableCollection以在所有项目上将此prop设置为false?

感谢您的回答!

3 个答案:

答案 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;
}