6

私は WPF C# アプリケーションを開発していますが、オブジェクトの変更で奇妙な動作をします。私はそれを一般的な方法で説明しようとします。次のように記述されたクラスのオブジェクトがあるとします。

public class A
{
  int one;
  bool two;
  List<B> listofBObjects;
}

ここで、B は次のとおりです。

public class B
{
  int three;
  int four;
}

A クラスのインスタンスと B クラスのインスタンスをウィンドウから別のウィンドウに渡します。2 番目のウィンドウで型 A と B の 2 つの変数のみを定義し、それらを 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();

このコードを 2 回繰り返す (つまり、ウィンドウを 2 回開く) 必要がある場合、最初の実行ではすべてが期待どおりに機能します。実際、instanceOfB変数の値を変更すると、変数にも変更が表示されinstanceOfAます。しかし、2 回目の実行では、 の変更instanceOfBは影響しませんinstanceOfA。変更は で行われnewWindowます。例えば:

this.instanceOfB.three++;
this.instanceOfB.four--;

FirstWindow にいると想像してください。ボタンをクリックすると、SecondWindow が開き、上記のように両方の変数が渡されます。SecondWindow でいくつかの変更を行い、[OK] をクリックして SecondWindow を閉じ、制御を FirstWindow に戻します。同じボタンをもう一度クリックすると、SecondWindow が再び開きます。ここで変更を行っても、両方の変数には影響しません。

コンソールの両方の変数を(VS2012で)制御式で調べようとしましたが、コードの最初のパスでは、上記のコードが実行されると両方の変数が変更されますが、コードの2番目のパスでは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は同等の結果が得られますが、2 回目の使用では異なります

なぜこのようなことが起こるのですか?他の説明が必要な場合は、質問を編集します ありがとう

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 に答える