【问题标题】:Update Single Item in the ObservableCollection without LINQ在没有 LINQ 的情况下更新 ObservableCollection 中的单个项目
【发布时间】:2015-08-11 03:38:38
【问题描述】:

我正在尝试创建在网络上运行的Components 列表。我正在尝试获取ObservableCollection 中的所有组件。 ObservableCollection<ClsComponent> 现在我的问题是,如果集合中的某个组件被更改/修改,我将如何将它反映到我的 ObservableCollection 组件

  1. 有没有办法直接在集合本身中更改它?
  2. 什么是快速有效的方法?

我尝试过:使用 LINQ 更改它:在集合中找到 Component 并更改它?

var CompFound = Components.FirstOrDefault(x=>x.Id == myId);
Components.Remove(CompFound);
Components.Add(UpdatedComp);

我很确定应该有更优化的方法来做到这一点。请提出建议。

编辑

我正在尝试在函数中编写代码,以便获取Source ComponentDestination Component 的参数。函数是这样的

public void UpdateComponent(ClsComponent SourceComp, ClsComponent DestComp)
{
  //do something here 
}

函数执行后,我想用目标组件替换源组件。

【问题讨论】:

  • 你的意思是说你想直接改变收藏?
  • 是的@MohitShrivastava 我想像删除一样直接更改它。只需要调用 Collection.Remove(Obj) 之类的东西
  • 您在那里所做的是将现有项目替换为新项目,而不是在同一索引处。您是说要对现有项目进行更改而不是替换吗?
  • 顺便说一句,你误用了FirstOrDefault
  • @jmcilhinney 是的,这两个陈述都是正确的。我想更改现有组件但要进行替换,因为我以 ClsComponent 对象的形式获得更新的组件

标签: c# wpf observablecollection


【解决方案1】:

我相信这可能对你有用。我相信你可能正在寻找这个

Components.Insert(Components.IndexOf(SourceComp), DestComp);
Components.Remove(SourceComp);

【讨论】:

  • 太棒了。它就像我想要的那样工作。正是我想要的。
  • 谢谢@DollyShrivastava
【解决方案2】:

最有效的方法之一是使用字典。 ObservableDictionary 的一些实现将为您提供 Observable 行为,同时允许对对象进行基于键的快速访问。 检查此stackoverflow question。它包括微软的

它应该像 ObservableCollection 一样工作,除了它也是一个字典。所以你可以创建ObservableDictionary<Int,ClsComponent>

要替换值只需调用

Components[myId] = destComp

【讨论】:

  • 提供了很好的链接。就我而言,我仍然不想使用INotifyCollectionChanged
  • 更新了我的答案。您不需要使用 INotifyCollectionChanged 来替换该值。如果你有多个3 items,字典也比 indexOf 快
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多