【问题标题】:When one item changes in a list, I'd like the same item in a different list to update as well当列表中的一项更改时,我希望不同列表中的相同项目也进行更新
【发布时间】:2014-04-17 05:21:52
【问题描述】:

我是徒手打出来的,所以请原谅我的任何拼写错误。感觉像这样创建一个简单的类将是代表我在实际项目中尝试完成的最简单的方法...无论如何

如果我在一个集合/列表 (Collection_A) 中编辑一个项目,我该如何做到这一点.. 它也会同时反映不同类 (Collection_B) 中的集合/列表中的更改?

现在我这样做的方法是只迭代 Collection_B 以获得相同的名称和品种.. 如果是这样,请将其替换为 Collection_A 中的内容...

我觉得可能有一个更优雅的解决方案,但我完全错过了一些简单的东西。或者我是智障,我的解决方案可能是最好的解决方案。

我只是想“提高”我的效率和编程技术.. 非常感谢

public class Dog
{
    public string name;
    public string breed;
}

public class DogList
{
    public string listName;
    public static ObservableCollection<Dog> Collection_B;
}

public static ObservableCollection<Dog> Collection_A;


Collection_A.Add(new Dog("Coco", "Chihuahua"));
Collection_A.Add(new Dog("Bubba", "Bulldog"));

DogList.Collection_B.Add(Collection_A[0]);
DogList.Collection_B.Add(Collection_B[0]);


Collection_A[0] = new Dog("Coco Moco", "Chuhuahua")  //how can i get this to reflect in Collection_B simultaneously?

【问题讨论】:

    标签: c# list collections observablecollection


    【解决方案1】:

    您可以在您的情况下简单地使用以下内容:

    Collection_A[0].name = "Coco Moco";
    Collection_A[0].breed = "Chuhuahua";
    

    更改将反映在两个列表中。

    【讨论】:

      【解决方案2】:

      订阅Collection_ACollectionChanged 事件并为每个可能的NotifyCollectionChangedAction 适当地更新Collection_B

      示例代码如下:

      ObservableCollection<int> cA = new ObservableCollection<int>();
      ObservableCollection<int> cB = new ObservableCollection<int>();
      
      cA.CollectionChanged += (sender, ev) =>
      {
          switch (ev.Action)
          {
              case NotifyCollectionChangedAction.Add:
                  foreach (int i in ev.NewItems)
                  {
                      Console.WriteLine("Item added");
                      cB.Add(i);
                  }
                  break;
              case NotifyCollectionChangedAction.Replace:
                  var idx = ev.NewStartingIndex;
                  var value = (int)ev.NewItems[0];
                  Console.WriteLine("Item {0} replaced with {1}", idx, value);
                  cB[idx] = value;
                  break;
          }
      };
      
      cA.Add(1);
      cA.Add(2);
      cA[1] = 3;
      
      Console.WriteLine(cB[1]); // outputs 3
      

      【讨论】:

      • 感谢您的建议。我要调查一下
      • 我很欣赏这个例子。将此添加到我的笔记和书签中以供我了解
      【解决方案3】:

      你可以在两个集合中使用相同的对象(因为它是一个 ref 类型)。 所以你的代码应该是这样的:

      var typeofdog = new Dog("Coco", "Chihuahua");
      Collection_A.Add(typeofdog );
      Collection_B.Add(typeofdog );
      

      现在您可以将 Collection_A["YOUR ITEM"] 更改为其他值,并且每个集合仍将引用正确答案: 示例:

      Collection_A["YOUR ITEM"].changeContant();//will reflect on both collections
      

      请注意,如果您将使用新词,这将不起作用,因为将初始化一个新对象。

      【讨论】:

        【解决方案4】:

        如果两个集合中的对象都是引用类型(例如,class 而不是struct),并且相同的实例被添加到两个集合中,则集合具有 reference 指向同一个对象实例。在任何一个地方所做的更改都会自动反映在另一个地方。

        但是,如果您将一个集合中的对象实例替换为另一个对象实例,则另一个集合将不知道它:它仍将持有对原始对象的引用。为了解决这个问题,您需要使用观察者模式

        根据您的收藏的语义和您的要求,您可以

        【讨论】:

        • 我遵循了您的第一段建议,而不是添加“新”对象,而是添加了对象本身,并且更改确实相互反映。正是我想要的,谢谢!
        猜你喜欢
        • 2017-08-17
        • 1970-01-01
        • 2017-07-21
        • 1970-01-01
        • 2023-03-17
        • 2012-04-15
        • 1970-01-01
        • 2015-05-26
        • 2019-08-17
        相关资源
        最近更新 更多