22

MVVM WPF アプリケーション内。

から 2 番目のウィンドウの親をどのように設定しますViewModelか?

例:

view1--viewModel1

viewModel1のコマンド呼び出し:

var view2 = new view2

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

view2.Show()

編集:

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

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

組み込みのメッセージング システムは優れています。ビューモデルから別のウィンドウを表示するようにビューにメッセージを送信しています。

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

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

4

5 に答える 5

25

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

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

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

乾杯、

ローラン

于 2010-05-03T23:26:32.913 に答える
8

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

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();
   }
}
于 2011-09-15T04:59:41.820 に答える
1

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

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

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

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

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

于 2010-05-03T21:20:32.657 に答える
0

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

この例のように

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回クリックし、レジスタポップアップメソッドでポップアップウィンドウを開くためのコードを記述します。

于 2010-11-23T05:36:46.940 に答える
0

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

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

于 2013-02-18T11:30:24.090 に答える