绑定更改未附加的变量

时间:2014-05-05 14:49:43

标签: c# wpf variables binding reference

我的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"!!
  }

}

1 个答案:

答案 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