【问题标题】:WPF ObservableCollection : possible to modify one particular property on all items at once?WPF ObservableCollection:可以一次修改所有项目的一个特定属性吗?
【发布时间】:2014-03-08 21:29:02
【问题描述】:

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

有没有办法以 ObservableCollection.Single(LINQ request) 的方式实现这一点,还是我必须在我的 ObservableCollection 上循环以在所有项目上将此道具设置为 false?

感谢您的回答!

【问题讨论】:

    标签: c# wpf linq observablecollection


    【解决方案1】:

    您必须循环,但至少将循环限制在需要重置的对象上:

    foreach(var zone in zones.Where(z => z.IsFiltered))
    {
         zone.IsFiltered = false;
    }
    

    正如其他答案/cmets 所提到的,请避免使用 Linq 进行更新。请参阅 Jon Skeet 的回答 https://stackoverflow.com/a/1160989/1202600 - Linq 用于查询,而不是更新。

    【讨论】:

    • 感谢您的回答!
    • 没问题,我已经更正了我的 Where 子句,因为在您发表评论时发现它是错误的! :)
    • 我在我的代码中看到并更正了;)。这样,您能否合并“foreach”中的“for each”并添加最后一个缺失的括号?我尝试过,但 SO 说只允许 6+ char mofifications。只是为了让人们在没有更新的情况下复制粘贴。再次感谢!
    【解决方案2】:

    我不确定这是否是您正在寻找的,但是 C# 中的 Lists 获得了 ForEach 方法,哪种方法可以满足您的需求,所以:

    myObservableCollection.ToList().ForEach(x => x.MyFlag = false);
    

    【讨论】:

    • 它本质上与foreach 循环相同,但有一个缺点;你要迭代两次。
    • 好点,但是因为它是在 ObservableCollection 对象上完成的,我们可以假设这个集合被用作用户界面上显示的对象的集合。如果集合中有这么多对象,这可能是一个性能问题,那么更大的问题可能是向用户显示它 - 不仅来自性能问题,而且更多是因为人们将无法简单地使用界面上显示的这些项目太多。
    • 这可能是真的,但无论如何我建议不要使用.ForEach(...),因为这种语法应该保留给表达式,不幸的是它存在,但没有增加任何实际价值。你可以很容易地阅读ForEach(x => x.MyFlag == false); 但这只是一个意见;)
    • @Amby - 火星上的水怎么样?问题不是关于线程安全,而是是否可以以 func 样式的方式进行更新。您无法从拥有它的其他线程访问可观察的集合,这对于曾经做过多线程 wpf 应用程序的任何人来说都是很明显的。
    • @ChrisW。 :谢谢,这本来是我要去的地方......但是正如cmets所说,它似乎在性能方面没有那么优化。至少现在我知道这个 ForEach() ;)
    【解决方案3】:

    发表我的想法(因为您尚未接受任何答案 - 请考虑您是否继续前进)

    除了遍历“ObservableCollection”之外别无他法。您可能会找到 API (linq) 为您执行此操作,但最终它必须遍历所有对象以更新其状态。

    如果您的集合被其他线程更新,那么您还需要考虑线程安全(如果在您迭代更新 IsFiltered 时其他线程更新,它将通过异常)

    另外一点是更新属性不会反映在绑定的 UI 中,除非该属性引发“NotifyPropertyChanged”事件。所以你的对象应该有如下内容:

    public bool IsFiltered{
    get { return _isFiltered; }
    set {
        if (_isFiltered == value) return; //no need to modify and trigger UI update
        _isFiltered = value;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多