我的WPF / C#应用程序问题确实很奇怪。我有一个返还另一个房产的房产。现在我创建一个变量并将其设置为其中一个属性。如果我现在通过绑定更改值,则变量也会更改。
为简化起见,请参阅以下代码:
这是第一个属性:
public MainDataObject CmObj_Temp { get; set; }
这里使用的是:
public MainDataObject CmObj_MainData {
get {
return TemporaryDataStore.CmObj_Temp;
}
set {
TemporaryDataStore.CmObj_Temp = value;
this.RaisePropertyChanged(() => this.CmObj_MainData);
}
}
我在这里设置变量:
CmObj_Backup = TemporaryDataStore.CmObj_Temp;
或者也像这样(没有什么不同):
CmObj_Backup = ((VM)this.DataContext).CmObj_MainData;
此处也用于绑定:
<TextBox Text="{Binding CmObj_MainData.Str_Internnr, Mode=TwoWay}"/>
现在,如果我更改文本框的文本,它也会在此处更改:
CmObj_Backup.Str_Internnr);
有人可以告诉我为什么吗?
我该如何改变?
THX
这是我的代码的一种较小形式:
public class DataObject
{
public string Str_Test1 {get; set;}
public string Str_Test2 {get; set;}
// --> Much more properties
}
public static class TempData
{
public static DataObject DObj1 {get;set;}
}
public class ViewModel
{
public DataObject DObj2 {
get {
return TempData.DObj1;
}
set {
TempData.DataObjet.DObj1 = value;
this.RaisePropertyChanged(() => this.DObj2);
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
var VM = new ViewModel();
this.DataContext = VM;
}
public void SomeWhereInTheSoftware()
{
((ViewModel)this.DataContext).DObj2.Str_Test1 = "Before";
ObjBackup = ((ViewModel)this.DataContext).DObj2;
((ViewModel)this.DataContext).DObj2.Str_Test1 = "After";
// --> Here is ObjBackup.Str_Test1 also "After"!!
}
}
答案 0 :(得分:0)
如果您要显示完整的代码块而不是随机选择的代码行,那么它将更容易理解。你的例子对我来说不是很清楚。
但是,我认为你遇到了一个问题,因为你认为你有一个对象的副本,当你真的有1.对象被保留作为参考,所以如果你创建一个MainObject和一个CopyObject你不能只设置CopyObject等于MainObject并期望有一个真正的副本。
再次,我可能会离开,因为我完全不了解你的问题,但例如:
class A {
public string Message { get; set; }
}
public static void Main()
{
A mainData = new A();
mainData.Message = "Main Data Message";
A backupData = mainData;
backupData.Message = "Backup Data Message";
Console.WriteLine(mainData.Message);
// Prints Backup Data Message
Console.WriteLine(backupData.Message);
// Prints Backup Data Message
}
编辑:克隆作为解决方案
正如Viv在评论中提到的,您的问题的解决方案是克隆对象,该对象创建对象的实际副本,而不是对对象的引用。
您将以这种方式更新A类:
class A : ICloneable
{
public string Message { get; set; }
public override object Clone()
{
A clone = new A();
clone.Message = this.Message;
return clone;
}
}
ICloneable的引用位于http://msdn.microsoft.com/en-us/library/system.icloneable.aspx