所以我的问题如下:
我将类 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:绑定模式:双向
答案 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。