我正在开发一个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
变量中的值,我也会在{{}}中看到修改{1}}变量。但是,在第二次执行中,instanceOfA
中的修改不会影响instanceOfB
...
修改在instanceOfA
中完成。例如:
newWindow
想象一下你在FirstWindow。单击一个按钮,打开SecondWindow,如上所述传递两个变量。在SecondWindow中,做一些修改,单击OK并关闭SecondWindow,将控制权返回给FirstWindow。如果我按下相同的按钮,我会重新打开SecondWindow。如果我现在进行修改,它们不会影响两个变量。
我尝试在控制台中使用控制表达式查看控制台中的两个变量(在VS2012中),我看到,在代码的第一遍中,当执行上面的代码时,两个变量都会发生变化,但是在第二次代码中,只有this.instanceOfB.three++;
this.instanceOfB.four--;
更改...
编辑: 按照我用来将参数传递给SecondWindow的代码...类型在下面解释
instanceOfB
考虑 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
时,对象结果等于,但在第二次使用时,它们是不同的
为什么会发生这件事? 如果需要任何其他澄清,我将编辑问题 感谢
答案 0 :(得分:1)
我无法重现你的问题。这是你的阶级关系的简化表示(正如我从你的问题中所理解的)。如果这是正确的,请告诉我们:
public partial class MainWindow : Window
{
internal A instanceOfA;
internal B instanceOfB;
public MainWindow()
{
InitializeComponent();
instanceOfB = new B() { };
instanceOfA = new A() { listOfBObjects = new List<B>() { instanceOfB } };
}
private void Button_Click(object sender, RoutedEventArgs e)
{
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();
}
}
public partial class SecondWindow : Window
{
internal A instanceOfA;
internal B instanceOfB;
public SecondWindow()
{
InitializeComponent();
Loaded += SecondWindow_Loaded;
}
void SecondWindow_Loaded(object sender, RoutedEventArgs e)
{
MessageBox
.Show(String.Format("{0}",
this.instanceOfB == this.instanceOfA.listOfBObjects[0]));
this.instanceOfB.three++;
this.instanceOfB.four--;
}
}
注意:这不是一个答案,只是试图为进一步的讨论建立一些共同点,因为评论不会给你足够的代码样本自由。
答案 1 :(得分:1)
很难给出正确答案,因为没有足够的代码来正确解决问题。但是,如果您是数据绑定,那么我认为您需要实现this接口。您可能只是因为模型没有反映出对屏幕的更改而存在问题。
答案 2 :(得分:0)
感谢@ pm_2和@BillZhang评论,我在代码中找到了this.currentPropertyToShow
编辑的行。在第一个窗口返回之后,事实上,我执行了窗口的刷新,但是不需要编辑this.currentPropertyToShow
,所以我对它进行了评论,一切正常!
感谢大家的宝贵意见和建议!