【问题标题】:Items in ObservableCollection being duplicatedObservableCollection 中的项目被复制
【发布时间】:2015-09-09 14:32:13
【问题描述】:

我有一个 WPF DataGrid 绑定到我的视图模型中的 ObservableCollection。我有上下文菜单操作来向上或向下复制行,即在当前选定行的上方或下方插入具有相同内容的新行。这一切都很好,但新插入的行似乎是另一行的副本。修改一个也会修改它的副本。这不是我想要的;我希望每一行都是分开的。这是我在视图模型中向下复制行的代码:

    private void DuplicateDownward()
    {
        CPWrapper row = GetSelectedRow();
        if (row == null)
            return;

        Channels.Insert(SelectedRow + 1, new CPWrapper(row.InnerCP));
    }

ChannelsObservableCollection<CPWrapper>(带有只读支持,仅使用 Clears 和 Inserts),CPWrapper 是一个包裹另一个对象的类(不重要)。 GetSelectedRow 返回当前选定的 DataGrid 行或 null。

如您所见,我正在从现有行中插入一个新对象,它仍然像同一个对象一样工作。我什至覆盖了CPWrapper 中的一些函数,如下所示:

public class CPWrapper
{
    private InnerObject cp;

    private static Random rand = new Random();

    private readonly int AntiCopy;

    public CPWrapper()
    {
        cp = new InnerObject();

        AntiCopy = rand.Next();
    }

    public CPWrapper(InnerObject arg)
    {
        cp = arg;

        AntiCopy = rand.Next();
    }

    public override int GetHashCode()
    {
        return AntiCopy.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        return false;
    }
}

我希望在来自随机整数的 GetHashCode 和始终返回 false 的 Equals 之间,系统会认为它们不一样。

任何建议将不胜感激。

【问题讨论】:

标签: c# wpf datagrid


【解决方案1】:

向您的 InnerObject 添加一个复制构造函数是唯一的解决方案。在 C# 对象中被引用。因此,即使您的包装器“认为”它是一个不同的对象,对“重复”的引用也直接指向“源对象”。

通过这样做,您将确定您使用的不是同一个对象。请记住,内部对象中的每个对象都应该有一个复制构造函数才能使其工作。否则对对象的引用将保持不变。

附加信息。 equals 方法的覆盖应该是return obj.AntiCopy == this.AntiCopy
否则即使您尝试知道Wrapper1 == Wrapper1 这将是错误的。但是,如果您确实添加了复制构造函数,则整个包装器在当前情况下将变得无用

【讨论】:

  • 为 InnerObject 添加复制构造函数确实解决了这个问题,谢谢。我的包装也不是没用的;它具有对视图模型有用但在模型中不需要的属性等。
猜你喜欢
  • 2012-07-30
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 2013-01-01
相关资源
最近更新 更多