0

ショートストーリー

私は BindingExpression オブジェクトを持っています。ソースと同じように (BindingExpression.UpdateSource を呼び出して) バインディングのターゲット側を更新したいと考えています。どうすればいいですか?

Silverlight に適応する方法がわからない WPF についても同様の質問があります: MVVM を使用して WPF でコンボボックスの選択をキャンセルする

長い話

コンボボックスの SelectedItem をビュー モデルのプロパティにバインドする双方向バインディングを指定します。コンボボックスはナビゲーションに使用されるため、ユーザーが選択することで、ビューモデルに別の場所に移動するように指示します。ビュー モデルには、ユーザーが誤って失いたくない未保存の変更が含まれている場合があります。そのため、ビュー モデルは確認ダイアログを表示し、ユーザーが本当に別の場所に移動して変更を破棄するかどうかを尋ねます。ユーザーが「いいえ」と言った場合は、コンボボックスに対する選択を元に戻して、ナビゲーションが試行される前と同じように元の状態に戻します。どうすればいいですか?

WPF の人 は、Silverlight には UpdateTarget メソッドがないことに注意してください (私の知る限り)。そのため、この質問が提起されました。

4

1 に答える 1

1

私があなたを正しく理解していれば、プロパティが変更SelectedItemされたときに、ビューモデルの属性にバッキングフィールドの以前の値を保存する必要があり、ユーザーが確認ダイアログをキャンセルすることを決定した場合は、SelectedItemバッキングフィールドを以前の値に復元する必要があります.

バッキング フィールドに通常のプロパティを使用している場合は、この動作を実装する Set メソッドを記述できます。

    private object selectedItemPreviousValue;
    private object selectedItemBackingField;
    public object SelectedItemBackingField
    {
        get
        {
            return selectedItemBackingField;
        }
        set
        {
            selectedItemPreviousValue = selectedItemBackingField;
            selectedItemBackingField = value;
        }
    }

依存プロパティを使用している場合は、次のようなコールバックPropertyMetadaを提供する必要があります。DependencyPropertyChantged

public object SelectedItemBackingField
    {
        get { return (object)GetValue(SelectedItemBackingFieldProperty); }
        set { SetValue(SelectedItemBackingFieldProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SelectedItemBackingField.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SelectedItemBackingFieldProperty =
        DependencyProperty.Register("SelectedItemBackingField", typeof(object), typeof(MapApp), new PropertyMetadata(new PropertyChangedCallback(OnSelectedItemChanged));

    public static OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
    {
        MyViewModel vm = (MyViewModel)sender;
        vm.selectedItemPreviousValue = args.OldValue;
    }
于 2012-12-05T18:19:19.167 に答える