2011-06-28 5 views
1

RadWindow(本質的にChildWindow)を持つ機能的なMVVMのパターン化されたSLアプリケーションがあります.ShowDialogを使用してウィンドウを表示するビューのコードビハインドを削除したいと思います。メインビューとウィンドウの両方が同じViewModelにバインドされている場合は、そのViewModelにバインドされます。ShowDialog MVVMLightを使用したRadWindow

ボタンには、MVVMLight RelayCommandを使用するViewModelコマンドと、ビュー内のイベントハンドラの設定状態を処理するコマンドの両方があります。

究極のソリューション/パターンは20回以上再利用されるため、コードビハインドよりも優れたものが得られるはずです。

思考?

private void Button_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    var window = new RadWindowTest.Controls.ChildWindow1(); 

    window.Closed += new System.EventHandler<Telerik.Windows.Controls.WindowClosedEventArgs>(window_Closed); 

    window.ShowDialog(); 

} 

答えて

0

この場合、DialogServiceを実装することをお勧めします。このサービスはビューモデルに注入することができます。テストでは、ビューに依存しないインスタンスを注入してテスト容易性を維持する必要があります。 ViewModelLocatorを使用して、このサービスをアプリケーションで使用できるようにすることができます。

もう1つのアプローチは、ダイアログを表示できるインターフェイスを実装するViewBaseクラスを実装することです。このインタフェースは、ViewModelによってダイアログを表示するために使用されるようになりました。もう一度テストするには、インターフェイスの別の実装を提供する必要があります。サンプルはhereです。

両方のアイデアは、ダイアログを表示する関数を因数分解するという同じ概念を中心にしています。 ViewとViewModelを厳密に連結解除するには、ViewModelがどのダイアログをshoenにするかを指定する方法と、ダイアログのresutまたはダイアログモデルを呼び出し側ViewModelに返す方法について考える必要があります。

どのアプローチがあなたの判断に基づいていますか。個人的には、共通の基底クラスからのビューを継承する必要がないため、最初のアプローチを優先します。

PS:ダイアログを表示するViewModel内のポイントに移動するには、コマンドを使用します。ダイアログサービスを使用するには、コードが必要ありません。

+0

恐縮です、ありがとうございます。 MVVMLightメッセージも同様に使うことができると思いますか、DialogServiceはもっと純粋な(無関係な)ものですか? – rusty

+0

明らかにあなたができることはありますが、それは子供の窓であるので、私は方法を呼び出すことがもっと合うと信じています。さらに、メッセージを送信することは、誰がそれに反応するかもしれないかを知らないブロードキャストです。したがって、気をつけなければ複数のダイアログがポップアップすることになります。 – AxelEckenberger

+0

私は議論を感謝します、私はあなたが提案するように向かって動作します。 – rusty

関連する問題