2011-01-11 2 views
5

alt textコレクション内のMVVM親ビューモデルにアクセスする

上記の画像は自分のプログラムを示しています。矢印はBindingを示します。

私のMainWindow.xamlのデータコンテキストは、MainVMと設定されています。

このウィンドウには、ObservableCollectionViewModelにバインドされたタブコントロールがあります。データテンプレートを使用すると、タブコントロールにViewModelに対応するビューが表示されます。

ObservableCollectionは、MainVMにあります。

MainVMにあるプロパティにアクセスするには、ViewModel(ObservableCollectionに囲まれています)からどうすればよいですか?

プログラミングモデルの変更が必要な回答があります。

答えて

6

ケント氏の言葉に基づいています。 。 。

ViewModelクラスは、アーキテクチャ上、MainVMについて何も知る必要はありません。それを知る必要があるものはViewModelのインスタンスに渡す必要があり、アトミックになり、それを呼び出すことについて心配する必要はありません。 SOLIDの観点からは、これは依存性反転の原則です。

ViewModel内でアクセスする必要があるMainVMのプロパティは、ViewModelのインスタンスの構築の一部として渡す必要があります。個人的には、私はコンストラクタにそれらを含めることのファンですが、プロパティとしてそれらを公開することもできます。

オーバーキルの方法(私はお勧めしません)は、コンストラクタを設定して、MainVMのインスタンスを取得し、コンストラクタにthisを渡します。あなたができるだけで、あなたのViewModel作成するとき例えば:

public class ViewModel 
{ 
    private readonly MainVM _parent; 

    public MainVM Parent => _parent; 

    public ViewModel(MainVM parent) 
    { 
      _parent = parent; 
    } 
} 

はその後:

ViewModel vm = new ViewModel(this); 
+1

を私は依存関係逆転の原則で動作するように私のプログラムを変更しました。プロパティを含むMainVMの代わりに、私のViewModelはプロパティを含み、MainVMを介して同期して保持されます。 –

+0

なぜそれは過剰ですか?私は、アトミックなVMの考え方に同意しますが、同様の親関係の例は(DataRow)行にあります。テーブル –

2

ViewModelのインスタンスは誰が作成しますか? MainVMViewModelの間に密接な関係がある場合は、おそらくViewModelはそのコンストラクタでMainVMのインスタンスを取るべきです。

MainVMにアクセスするのを必要としない別の設計を提案することもできます。これを行うには、より多くの情報(および別の質問)が必要です。

4

どのくらいの相互作用が必要かに応じて、ViewModelクラスのイベントを発生させて、MainVMがそれらを処理して個別のViewModelのプロパティを設定するようにすることができます。あなたは(私はMainVMどこ?で行われていると仮定)のViewModelコレクションをインスタンス化するとき

別のオプションは次のようになり、あなただけのコンストラクタパラメータとしてMainVMに合格し、維持し、各ViewModelの内部MainVMのインスタンスがあります。