我正在开发一个 WPF C# 应用程序,我在修改对象时有一个奇怪的行为。我试着用一般的方式来解释它。假设你有一个类的对象,描述如下:
public class A
{
int one;
bool two;
List<B> listofBObjects;
}
其中 B 是:
public class B
{
int three;
int four;
}
我将A类的一个实例和B类的一个实例从一个窗口传递到另一个窗口,只在第二个窗口中定义了A和B类型的两个变量,并在Show()方法之前传递它们,使用以下代码,执行到一个窗口 FirstWindow 的实例:
SecondWindow newWindow = new SecondWindow();
newWindow.instanceOfA = this.instanceOfA; //instanceOfA is of type A
newWindow.instanceOfB = this.instanceOfA.listOfBObjects[0]; //instanceOfB is of type B
newWindow.Show();
如果我必须重复此代码两次(即打开两次窗口),在第一次执行中一切都按预期工作,事实上如果我修改变量中的值instanceOfB
,我也会在变量中看到修改instanceOfA
。但是,在第二次执行中,修改 ininstanceOfB
不会影响instanceOfA
... 修改是在newWindow
. 例如:
this.instanceOfB.three++;
this.instanceOfB.four--;
想象一下,您在 FirstWindow 中。单击一个按钮,SecondWindow 打开,如上所述传递两个变量。在 SecondWindow 中,进行一些修改,单击 OK,SecondWindow 关闭,将控制权返回给 FirstWindow。如果我再次单击同一个按钮,我会重新打开 SecondWindow。如果我现在进行修改,它们不会影响这两个变量。
我尝试使用控制表达式查看控制台中的两个变量(在 VS2012 中),我看到,在第一遍代码中,两个变量在执行上面的代码时都发生了变化,但是在第二遍代码中,只有instanceOfB
变化...
编辑:按照我用来将参数传递给 SecondWindow 的代码...类型解释如下
IntermediatePosition obj = ((FrameworkElement)sender).DataContext as IntermediatePosition; //IntermediatePosition is Class B
IntermediatePositionsSettingsWindow ips = new IntermediatePositionsSettingsWindow();
ips.currentIntermediatePosition = obj;//this is the instanceOfB
ips.idxOfIpToModify = obj.index;
ips.currentSingleProperty = this.currentPropertyToShow; //this is the instanceOfA object
ips.sideIndex = this.sideIndex;
ips.ShowDialog();
考虑obj
通过一个按钮选择进入数据网格,其中每一行代表一个IntermediatePosition
对象。在数据网格中,有一个列按钮,通过按钮单击,IntermediatePositionsSettingsWindow
将使用正确的数据打开
编辑:我已经进行了以下检查:
this.currentPropertyToShow.sides[this.sideIndex].intermediatePositionList[i].GetHashCode() == obj.GetHashCode()
其中i
是相关IntermediatePosition
对象的索引。对象的第一次使用IntermediatePositionsSettingsWindow
结果相等,但在第二次使用时它们是不同的
为什么会发生这种事情?如果需要任何其他澄清,我将编辑问题谢谢