WPF绑定更新对象不应该

时间:2018-02-14 09:21:53

标签: c# wpf data-binding binding

所以我的问题如下:

我将类 MyClass Items 对象传递给 <的新实例WPF中的em> MyWindow 。我正在通过价值而不是参考。然后我将 MyWindow 的某些控件(文本框,组合框等)绑定到名为 ItemsReplicate 的新字段的属性 MyWindow MyClass 的强>>等于 项目 即可。但是,当我对 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;
}

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

非常感谢。

PS:绑定模式:双向

1 个答案:

答案 0 :(得分:0)

评论后编辑。

类的默认参数传递是每个引用,即使没有&#34; ref&#34;关键字,仅对对象本身的引用进行更改,在外部&#34;上显示。

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的引用副本传递为&#39; _item&#39;。然后,您将该参考副本存储在&#39; innerItem&#39;以及DataContext中。它仍然只是一个具有多个引用副本的MyClass实例。引用的每个副本只指向该类的相同实例。

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

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

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