绑定更改未附加的变量

本文关键字:变量 绑定 | 更新日期: 2023-09-27 18:01:40

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

绑定更改未附加的变量

如果您将显示完整的代码块而不是随机选择的代码行,将更容易理解。我不太明白你的例子。

然而,我认为你有一个问题,因为你认为你有一个对象的两个副本,而你实际上有一个。对象被保存为引用,所以如果你创建一个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;
    }
}

iclonable的参考在这里http://msdn.microsoft.com/en-us/library/system.icloneable.aspx