2011-08-08 30 views
2

MVVMに新規で小さな問題があります。私は2つのユーザーコントロールを持っています:親と子(ビュー、ビューモデル、モデルクラス)。そして、親から子にいくつかのプロパティを渡す必要があります。今のIVEは、このようなコードを書くことで、それを管理する:MVVMの1つのビューから別のビューのビューモデルにプロパティを渡す

public static readonly DependencyProperty CallbackActionProperty = 
       DependencyProperty.Register("CallbackAction", typeof (Action), 
     typeof (ChildView), new PropertyMetadata(default(Action))); 

public Action CallbackAction 
{ 
    get { return (Action) GetValue(CallbackActionProperty); } 
    set 
    { 
    SetValue(CallbackActionProperty, value); 
    ((ChildViewModel)this.DataContext).CallbackAction = value; // Change ViewModel property too 
    } 
} 

これはChildViewで依存関係プロパティであり、そのセットに私もそのViewModelのプロパティを設定します。その後、私はParentViewからその依存関係プロパティにアクセスし、子のViewModelにCallbackActionを設定するCallbackAction - >を設定します。
コード:

this.Loaded += (sender, args) => childUc.CallbackAction = ((ParentViewModel) this.DataContext).RefreshStatuses; 

childUcは、ユーザーコントロール、親に位置し、ChildViewで表さあります。 コードは醜いので、パターンを壊さないという観点から、より良い練習を見たいと思っています。 ありがとうございます。

+0

(また、あなたの依存関係プロパティのゲッターやセッターのロジックを追加しないでください、このコードは、またはあなたの依存関係プロパティの値が設定されている方法に応じて呼び出されてもしなくてもよい。)質問は何ですか? –

+0

@Mario Vernari、物事を説明しようとする正しい方法は何ですか? – 0x49D1

答えて

3

ええ、このコードはかなり醜いです。実際、私はそれが何をしているのか正確に解決するために苦労しています!

MVVMパターンの主なテナントの1つは、ViewModelがユニットテスト可能であり、ビューなしで実行できることです。この種の問題に直面したときは、ビューモデルだけを考え、ビューを無視してください。

ParentViewModelにChildViewModelへの参照が含まれている場合、ChildViewModelを作成するときにParentViewModel自体に参照を提供させることで、これを双方向関係にすることができます。これは、ChildViewModelからParentViewModel上の任意のパブリックメソッドを実行できることを意味します。

これを念頭に置いて、問題を解決できるはずです。

+0

うーん、素晴らしい提案!確かに私は親のインターフェイスを作成し、そのインターフェイスタイプの参照を子に渡すことができます(私はその子のために多くの "異なる"親のusercontrolsを持つことができます)。ありがとう、私はしようとします。ちょうどViewModelの考え方についての示唆は私が考えると最高です。確かにViewなしで動かなければならない。 – 0x49D1

+0

はい、呼び出すことができるはずのメソッドしかないChildViewModelにインターフェイスを渡すことは良いアイデアのように聞こえます。 – ColinE

+1

子どもたちは、親が誰であるかを知るべきではありません。あなたが何かの子孫から何かを "通信"したいなら、あなたはコマンドを使うべきです。これにより、結合なしで祖先にデータを交換することができます。 –

1

セッターまたはゲッターにDependencyPropertyのロジックを書き込まないでください。これは、set/getアクセサを直接経由するのではなく、フレームワークによって呼び出されるためです。これは必須ルールです。導入

また、文字列

((ChildViewModel)this.DataContext).CallbackAction = value; 

これはMVVM原理ではなく、現在のビューおよびその下のViewModelタイプ間の結合を結びました。

View依存関係の場合、XAMLのバインディングを使用してプロパティを渡すことを検討する必要があります。そうでない場合、ParentViewModelはコンストラクタを通じてChildViewModelを注入する必要があります。だから、ParentViewModelに子が1つあることを示すように設計する必要があります。

関連する問題