【问题标题】:WPF binding updates object it's not supposed toWPF 绑定更新它不应该的对象
【发布时间】:2018-07-24 19:26:36
【问题描述】:

所以我的问题如下:

我正在将一个名为 Items 的对象传递给 MyClass 类的一个新实例 MyWindow。我是按价值传递,而不是按引用传递。然后我将 MyWindow 的某些控件(文本框、组合框等)绑定到名为 ItemsReplicate 的新字段的属性中MyClass 中的 strong> 属于 MyWindow 并且等于 Items em>。但是,当我对 MyWindow 中的任何控件进行更改时,Items 的属性也会由于某种原因被覆盖.这是正常的吗?还是我错过了什么?

代码说明如下:

var passThis = (MyClass)myItem;
MyWindow wnd = new MyWindow(passThis);

public partial class MyWindow : Window
{
    public MyWindow (MyClass _item)
    {
        InitializeComponent();
        innerItem = _item;
        this.DataContext = innerItem ;
    }

    private MyClass innerItem;
}

因此,在此过程结束时,通过绑定所做的任何更改都会影响 myIteminnerItem

非常感谢。

PS:绑定方式:双向

【问题讨论】:

  • 将您的代码添加到问题中。
  • 抱歉,我这样做了。请再次检查。
  • 非常感谢,我不知道类实例总是按值传递的。我创建了 myClass 的深层克隆,以便按值传递。

标签: c# wpf data-binding binding


【解决方案1】:

评论后编辑。

类的默认参数传递是按引用传递的,即使没有“ref”关键字,它只会使对对象本身的引用的更改“在外部”可见。

MyClass c = new MyClass();

MyMethod(c);
MyRefMethod(ref c);

public void MyMethod(MyClass innerc)
{
    innerc = new MyClass(); //stays local, c is still its old reference
}

public void MyRefMethod(ref MyClass innerc)
{
    innerc = new MyClass(); //c becomes a new reference to the local innerc
}

与您的情况一样:您将 MyClass 的引用副本作为“_item”传递。然后将该引用副本存储在“innerItem”以及 DataContext 中。它仍然只是 MyClass 的一个实例,具有多个引用副本。引用的每个副本只指向该类的同一个实例。

当您使用 WPF 中的绑定修改 MyClass 的公共属性的值时,您的原始 MyClass 实例中的值将得到更新。

换句话说:这是正常行为。

如果你真的想要你的类的深层副本,the easiest way is to serialize and desialize it

【讨论】:

  • 非常感谢您的回复!然而我所做的(请参阅我的问题的编辑版本以及添加的代码)是不同的。
  • 这仍然是一样的方式,您不交出 MyClass 的副本,而是对同一副本的引用。因此它仍然是正常行为并且与 MyMethod 相同。我的“参考”-解释只是为了说明另一点。在这两种情况下,您都传递了一个引用,以及您的代码 sn-p。
  • 感谢您的解释。我没有意识到这一点。正如您所指出的那样,我设法通过创建类实例的深层克隆来解决问题(浅拷贝并没有削减它)。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
相关资源
最近更新 更多