0

これに対して(Stack Exchange Guruによって)提供されたいくつかの回避策がありますが、子コントロールでイベントを作成し、親でそれをサブスクライブ/リッスンするオプションがあることを読んだので、これを正しく達成する方法に興味があります.

onPropertyChanged が正常に起動する子コントロールがあります。

public class KeypadEventArgs : EventArgs
    {
        public KeypadEventArgs(double result)
        {
            Result = result;
        }

        public double Result { get; set; }
    }

protected void OnPropertyChanged(string name)
    {
        switch (name)
        {
            case "Result":                    
                    KeyUpdated(this, new KeypadEventArgs(Result));
                break;
        }
    }

次のように、XAML のホスト コントロールに追加されます。

<UserControl:KeypadView Width="200" Height="300" Visibility="Collapsed" />

ここで、ホスト/親コントロールが子コントロールの KeyUpdated イベントをサブスクライブするようにします。

何かのようなもの:

this.keypadViewModel.KeyUpdated += this.OnKeyUpdated;
...
private void OnKeyUpdated(object sender, KeypadViewModel.KeypadEventArgs e)
    {
        value = e.Result;
    }

MVVMパターンは、ViewModelがViewにアクセスすることを本当に望んでいないことを(ちょっと)理解しています。では、親が子コントロールを「作成」しない場合、どのようにそれを認識しているのでしょうか?

4

2 に答える 2

1

ここでパターンを少し誤解しているかもしれませんが、親は子 ViewModel をリッスンする独自の ViewModel を持っているはずだと思います。子が変更されると、親の ViewModel に通知するのは ViewModel であり、それに応じて親のビューが更新されます。

しかし、私が言ったように、私は誤解しているかもしれません。

編集:

基本的には次のように動作するはずです:

子ビュー -> 子ビュー モデル -> 親ビュー モデル -> 親ビュー

したがって、子ビューに子ビュー モデルを変更させます。親ビュー モデルが変更を通知するイベントをリッスンしていることを確認し、親ビューがそこから親ビュー モデルをリッスンするようにします。

于 2012-11-13T12:33:25.883 に答える
0

ああ、私の悲しい悲しい袋。コマンドでチェーンをバインドできます。

私の質問に100%答えるわけではありませんが、教えてくれました。

Command={Binding Parent.DataContext.SomeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}
于 2012-11-13T14:00:54.467 に答える