1

NumericUpDown があります。ユーザーがその値を変更すると、確認のために MessageBox を表示します。ユーザーが [はい] を選択した場合、すべて問題ありません。ユーザーが [いいえ] を選択した場合、元の値に戻します。

私は2つの問題に遭遇しました:

Q1. 元の値を取得する方法。
ユーザーが [はい] を選択すると更新されるプライベート メンバー変数に格納します。しかし、もっと良い方法があれば知りたいです。

Q2. 値を元の値に再度変更すると、イベント ハンドラーがトリガーされます。
それを処理するためにif条件を入れました。

これが私の現在のコードです:

if (mNumericUpDownValue != mReactantNumericUpDown.Value)
{
    bool change = !mIsModified;
    if (mIsModified && ReportChangeWarning())
    {
        change = true;
    }
    if (change)
    {
        mReactantGroup = (int)mReactantNumericUpDown.Value;
        ClearUserValues();
        UpdateControls();
    }
    else
    {
        mReactantNumericUpDown.Value = mNumericUpDownValue;
    }
}
4

3 に答える 3

2

値にバインドしている場合は、ユーザーが確認するまで数値をまったく変更できないようにすることができます。プロパティは次のように記述します。

    private int _testNumber;

    public int TestNumber
    {
        get { return _testNumber; }
        set
        {
            if (_testNumber != value)
            {
                MessageBoxResult result = MessageBox.Show("Change value?", "Change Value?", MessageBoxButton.YesNo);

                if (result == MessageBoxResult.Yes)
                {
                    _testNumber = value;                        
                }

                RaisePropertyChanged("TestNumber");
            }
        }
    }
于 2013-07-17T13:25:28.203 に答える
1

このロジックは単純化できると思います
(ただし、TrueEddie からの回答が気に入っています。これはコメントするには多すぎます)。

if (isModified & !Report)
{
   mReactantNumericUpDown.Value = mNumericUpDownValue;   
}
else
{
   mReactantGroup = (int)mReactantNumericUpDown.Value;
   ClearUserValues();
   UpdateControls();
}
于 2013-07-17T13:34:17.597 に答える
0

この動作を実現するには、モデルにIEditableObjectを実装することをお勧めします。それは本当に簡単で、私見はあなたが望むことをする正しい方法です。

于 2013-07-17T13:12:19.583 に答える