1

オブジェクトのフィールドにバインドされた ComboBox の SelectedItem プロパティがあります。ほとんどの場合、問題なく動作する TwoWay バインディングを使用します。読み込まれると、ドロップダウンの選択はフィールドのゲッターから設定され、選択を手動で変更するとフィールドのセッターが呼び出されます。

ただし、確認ダイアログを表示したい場合があります。ユーザーが「いいえ」をクリックした場合、値を同じままにしておきます。これが私のコードです:

public A Afield
{
    get { return _afield; }
    set
    {
        SetA(value);
    }
}
public void SetA(LocationConfiguration value, bool prompt = true)
{
    if (/*selection would cause irreversible changes*/)
    {
        if (prompt)
        {
            MessageBoxResult result = Microsoft.Windows.Controls.MessageBox.Show(
                    "bla bla bla",
                    "bla",
                    MessageBoxButton.YesNo,
                    MessageBoxImage.Warning);
            if (result != MessageBoxResult.Yes)
                return;
        }
        PerformIrreversibleChanges()
    }
    _afield = value;
    NotifyPropertyChanged("Afield");
}

コードビハインドのすべてが完全に機能します。ユーザーが受け入れると、変更が行われます。ユーザーが「いいえ」を押すと、_afield は変更されません。このプロパティにバインドされた他のコントロールは、正しい値を表示します。

ただし、ComboBox の表示は _afield の値に戻りません。変更を拒否した場合でも、選択したままになります。何らかの理由で、プロパティが設定されるまでコンボボックスの項目が設定されないようです。その時点で、コードビハインドに保持されている正しい値ではなく、ユーザーが選択したものが表示されます。

4

4 に答える 4

0

選択が変更されるとすぐにプロパティが更新される双方向バインディングのため、元に戻す必要があるため、ユーザーが変更をキャンセルした場合は前の値にリセットする必要があります。以前の値を取得するために、イベント引数の RemovedItems プロパティを確認できます。

于 2012-10-04T19:33:32.960 に答える
0

または、以前の値を保存して、ユーザーが「いいえ」を押した場合のフォールバックとして保持することもできます

 private A previousAfield;
 public A Afield
 {
    get { return _afield; }
    set
    {
       previousAfield = _afield;
       SetA(value);
    }
 }
于 2012-10-04T20:11:57.840 に答える
0

なんとか修正できましたが、解決策はきれいではありません。バインディングに加えて、SelectionChanged イベントのハンドラーが用意されました。このハンドラーは、選択をあるべき状態に戻します。コードは次のとおりです。

private void cbox_Abox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    foreach (ComboBoxItem cbi in cbox_Abox.Items)
        if ((string)cbi.Content == BoundObject.Afield.ToString())
            cbox_Abox.SelectedItem = cbi;
}

これで、ComboBox の値を手動で選択するたびに、バインディングを介して値がオブジェクトに書き込まれ (以前と同様)、このハンドラーを使用して値がオブジェクトから ComboBox にコピーされます。

何らかの理由で、ここで PropertyChanged イベントを使用してもコンボボックスが更新されないため、ComboBox.SelectedIndex を明示的に呼び出す必要がありました。

于 2012-10-04T19:59:59.743 に答える
0

SetA にブール値を返させる

set
{
     if (value == _afield) return;         
     if (SetA(value)) _afield = value;
     NotifyPropertyChanged("Afield");
}
于 2012-10-04T20:08:09.697 に答える