绑定更改未附加的变量
本文关键字:变量 绑定 | 更新日期: 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