1

MVVMパターンを、(それぞれのViewModelを使用して)数十の画面を持つアプリケーションに適用しています。今、私は非常に単純な点で立ち往生しています...新しいウィンドウを作成し、viewModelをインスタンス化し、互いに割り当てる責任があるのは誰ですか?

ビューまたはViewModelでこれを行うのは間違っていると思います。外部フレームワークの使用を勧める多くの返信を見ましたが、それは私にとって選択肢ではありません。

どう思いますか?

Windowsの公式の推奨事項は何ですか?

4

2 に答える 2

0

これが私がすることです:

  • アプリケーション ルートとして mainviewmodel を持つ 1 つのメインウィンドウ
  • 必要に応じてビューモデルを使用してログインビュー
  • すべての子/モジュールに対するビューモデルの最初のアプローチ
  • ダイアログ用に駆動されるダイアログサービスビューモデル
  • Windows用に駆動されるwindowservice viewmodel

mainviewmodel は、MEF を介してモジュールを構成します。

于 2012-07-04T13:51:45.630 に答える
0

例を試してみましょう。ユーザーがボタンをクリックすると、はい/いいえで確認ダイアログ ボックスが表示されます。通常、ボタンのイベント ハンドラーで通知を発生させます。

private void Button_Click(object sender, MouseRoutedEventArgs e)
{
    var result = MessageBox.Show("Confirm?", MessageBoxButton.YesNo);
    if (result == true)
        //something
    else
        //something else
}

MVVM があるので、ビジネス ロジック(ここではif/else) を ViewModel に移動する必要があります。ただし、UIは UI コントロールに残す必要があります。これが ViewModel であるとします。

public class VM
{
    public void DoSomething()
    {
        //raise the confirmation interaction
    }
}

ViewModel は UI を所有することはできませんが、ユーザーとのやり取りに必要なアブストラクトを所有することはできます。

これはインタラクションのインターフェースかもしれません:

public interface IConfirmationInteraction
{
    bool? RaiseConfirmationRequest(string message);
}

したがって、ViewModel は次のようなプロパティを持つことができます。

public IConfirmationInteraction ConfirmInteraction { get; }

VMインスタンス化せず、VM他の誰かから渡されたインターフェースのインスタンスを受け入れます。たとえば、コンストラクターでは次のようになります。

public VM(IConfirmationInteraction confirmInteraction)
{
    if (confirmInteraction == null)
        throw new ArgumentNullException(nameof(confirmInteration));
    ConfirmInteraction = confirmInteraction;
}

したがって、そのメソッドは次のようになります。

public void DoSomething()
{
    var result = ConfirmInteraction.RaiseConfirmationRequest("Confirm?");
    if (result == true)
        //do something
    else
        //do something else
}

そしてUI?UI 要素を使用する具体的なインタラクションを作成できます。

public class UIConfirmationInteraction : IConfirmationInteraction
{
    public bool? RaiseConfirmationRequest(string message)
    {
        return MessageBox.Show(message, MessageBoxButton.YesNo);
    }
}

ポイントがわかりますか?パターンを保存しました。ViewModel はロジックで動作し、さまざまな抽象化をまとめますが、実装、メッセージ ボックス、ボタンなどについては何も知りません。これらの相互作用を UI 相互作用として実装できます。たとえば、を所有する UI コントロールVM:

public class MyControl : USerControl
{
    public MyControl()
    {
        DataContext = new VM(new UIConfirmationInteraction());
    }
}

ただし、たとえば、デフォルトの回答「はい」またはデフォルトの回答「いいえ」を試すテストリストを実行する場合など、自動結果としてそれらを実装することもできます。

public class YesConfirmationInteraction : IConfirmationInteraction
{
    public bool? RaiseConfirmationRequest(string message)
    {
        return true;
    }
}

これを「依存性注入」と呼びます。Google で試してみてください。多数のチュートリアルが見つかります。この場合、コンストラクターによる依存性注入を構築しました。

これは、ViewModel を介して UI コントロール間のすべてのブリッジを手動で構築できる確実な方法ですが、パターンは維持されます。

于 2016-08-29T20:40:53.443 に答える