2016-09-01 28 views
0

MVVMパターン、C#および.NET Framework 4.6.1を使用してWPFを開発しています。別のViewModelからViewModelにアクセスする

私はUserControl(Control1)を含むウィンドウを持っており、そのUserControlには別のUserControl(Control2)が含まれています。私はダイアログウィンドウを使用する代わりに、この方法を選択しました(Control2はダイアログウィンドウとして機能します)。

両方のユーザーコントロールにViewModel(Control1VMおよびControl2VM)があります。

私は、ユーザーがアプリケーションを起動するために必要ないくつかのデータを入力できるようにフォームとしてControl2を使用します。

これはControl1とメインウィンドウです:

enter image description here

そして、これはControl1オーバーControl2です。

enter image description here

私の問題は、私はOKまたはキャンセル]ボタンをクリックしたときControl2を非表示にする方法がわからないということです。

これはControl2Control1に設定されている方法です。Control2を表示するには

<Grid x:Name="gridControl2" Margin="30" Grid.RowSpan="6" Grid.ColumnSpan="3" Visibility="{Binding GridControl2Visibility}"> 
    <local:Control2 x:Name="userControlControl2" /> 
</Grid> 

Control1VMVisibleGridControl2Visibilityを設定します。

私は、[OK]をクリックするか、[キャンセルするとき、私は Control2を非表示にすることができますどのように
public Visibility GridControl2Visibility 
{ 
    get { return gridControl2Visibility; } 
    set 
    { 
     if (gridControl2Visibility != value) 
     { 
      gridControl2Visibility = value; 

      RaisePropertyChangedEvent("GridControl2Visibility"); 
     } 
    } 
} 

Control2のボタン私の問題は、GridControl2VisibilityControl1VMにあり、そのクラスにControl2VMからアクセスできないということです。

+0

一般的な方法は、MVVMツールキットのメッセージング機能です。 – Lennart

+0

ウィンドウ用のVMも作成し、その中にChild VMのインスタンスを保持します。子VMは、その子VMインスタンスで構成されます。この方法で、ウィンドウVMからコード全体を制御できます。 – ViVi

答えて

1

両方のビューモデルがアクセスできるサービスを使用し、Control2を表示するかどうかの情報を格納します。理想的には、サービスはあなたの二重コンテナにシングルトンとして登録され、ビューモデルに注入されます。

また、イベントアグリゲータを使用することもできます。イベントアグリゲータは基本的にシングルトンサービスですが、状態を保持するのではなくイベントを配信することに重点を置いています。

+0

これを行うには、私はこの記事に従っている:https://rachel53461.wordpress.com/2011/10/09/simplifying-prisms-eventaggregator/ – VansFannel

-1

イベントを使用できます。Control2VMからイベントを発生させ、Control1VMでイベントを発生させ、GridControl2Visibilityをfalseに設定できます。

関連する問題