6

我正在开发一个 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].Ge‌​tHashCode() == obj.GetHashCode()

其中i是相关IntermediatePosition对象的索引。对象的第一次使用IntermediatePositionsSettingsWindow结果相等,但在第二次使用时它们是不同的

为什么会发生这种事情?如果需要任何其他澄清,我将编辑问题谢谢

4

3 回答 3

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--;
    }
}

注意:这不是一个答案,只是试图为进一步讨论建立一些共同点,因为注释不会给你足够的代码示例自由。

于 2013-08-02T14:30:32.017 回答
1

很难给出正确的答案,因为没有足够的代码来正确解决这个问题。但是,如果你是数据绑定,那么我相信你需要实现这个接口。您的问题可能只是您的模型没有反映屏幕的更改。

于 2013-08-02T15:57:28.640 回答
0

感谢@pm_2 和@BillZhang 的评论,我在我的代码中找到了一行this.currentPropertyToShow被编辑的地方。在第一个窗口返回后,事实上,我执行了窗口的刷新,但不需要编辑this.currentPropertyToShow,所以我已经评论它并且一切正常!感谢大家宝贵的意见和建议!

于 2013-08-06T09:02:16.393 回答