web-dev-qa-db-ja.com

WPFMVVMビューモデルから親を取得

MVVMWPFアプリケーション内。

ViewModelから2番目のWindowsの親をどのように設定しますか?

例:

view1 --viewModel1

viewModel1のコマンド呼び出し:

var view2 = new view2

view2.Owner = <----これは問題のある領域です。ここでviewModelからview1を所有者として取得するにはどうすればよいですか?

view2.Show()

編集:

以下の承認された回答を参照してから、次の編集を読んでください。

私はMVVMライトを使用しています-> http://mvvmlight.codeplex.com/ (素晴らしいところで)

焼き付けられたメッセージングシステムは素晴らしいです。ビューモデルからビューにメッセージを送信して、別のウィンドウを表示するように指示しています。

メッセージの場合、現在、メインビューでswitchステートメントを含む文字列を使用して、開くビューを決定しています。ただし、MVVMライトツールキットの一部でもあるトークンをいじくり回すことができます。

ありがとうございました!

21
dnndeveloper

私の意見では、新しいウィンドウを開くことは、ViewModelではなく、Viewの責任です。個人的には、ダイアログボックスの表示に使用するのと同じアプローチを使用します(これについては、このフォーラムですでに説明しました)。

ViewModelに、新しいウィンドウを開くように要求するメッセージをビューに送信させます。 (または)IDialogServiceを使用するか、ViewModelのコンストラクターに渡すIDialogServiceを呼び出します。このサービスは、ウィンドウを開く(またはこのタスクをビューに委任する)ことを担当します。このようにして、関心の分離を明確に保ち、​​VMはテスト可能のままです(新しいウィンドウを開く要求が送信されたことを単体テストできますが、ウィンドウをテストできませんでした)確かに、オープンになっています)。

それは理にかなっていますか?

乾杯、

ローラン

25
LBugnion

ビューモデルの呼び出しから

Messenger.Default.Send<NotificationMessage>(new NotificationMessage("Open Window"));

そして、ビューのコードビハインド(2番目のビューを呼び出すビュー)から、コンストラクターでこれを簡単に記述します。

Messenger.Default.Register<NotificationMessage>(this, ReplyToMessage);

また、このメソッドをビューのコードビハインドに記述します。

private void ReplyToMessage(NotificationMessage msg)
{
   if (msg.Notification == "Open Window")
   {
      SecondWindow win = new SecondWindow();
      win.ShowDialog();
   }
}
7
Mohammad Zare

私自身の答えはありませんが、最近見ているものへのリンクがいくつかあります。他の人が提案するものにも興味があります。

私が理解しているように、重要なことは、あなたビューモデル内からビューを作成するべきではない可能であれば、疎結合の方法で必要なものを伝達する手段が必要です。

http://www.codeproject.com/KB/WPF/XAMLDialog.aspx

http://www.codeproject.com/KB/architecture/MVVM_Dialogs.aspx

MVVMを使用したWPFでのダイアログの処理

1
Grokodile

いくつかのイベントを作成してビューに登録し、ビューモデルでこれらを呼び出す必要があるように、この方法で行うことができます。そのポップアップウィンドウを開きます。

この例のように

public class Mainclass : MainView
{
  public delegate abc RegisterPopUp(abc A);
  public RegisterPopUp POpUpEvent;

  public RelayCommand ShowCommand { private set; get; }  

  public void ShowCommand() 
  { 
    ShowCommand("Your parameter");
  } 
}

ビューの内側

MainView mn = new MainView();

mn.POpUpEvent +=のようにここでイベントを登録し、タブボタンを2回クリックし、登録ポップアップメソッドにポップアップウィンドウを開くためのコードを記述します。

0
Hoshiyar

Prism-Event Aggrigatorは、依存関係のない独立したモジュールを作成できる優れたアプローチです。最初のviewmodelはイベントを公開し、次に別のビューまたはビューまたはviewmodelがイベントアグリゲーターからそのイベントをサブスクライブできます。

この場合、Unityコンテナーを使用して、依存性注入を使用して1つのビューモデルを別のビューモデルに注入することもできます。

0
Jitendra