c#对象修改:一种奇怪的行为

时间:2013-08-02 14:02:38

标签: c# wpf object

我正在开发一个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].Ge‌​tHashCode() == obj.GetHashCode() 是相关i对象的索引。首次使用IntermediatePosition时,对象结果等于,但在第二次使用时,它们是不同的

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

3 个答案:

答案 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,所以我对它进行了评论,一切正常! 感谢大家的宝贵意见和建议!