MVVMパターンを、(それぞれのViewModelを使用して)数十の画面を持つアプリケーションに適用しています。今、私は非常に単純な点で立ち往生しています...新しいウィンドウを作成し、viewModelをインスタンス化し、互いに割り当てる責任があるのは誰ですか?
ビューまたはViewModelでこれを行うのは間違っていると思います。外部フレームワークの使用を勧める多くの返信を見ましたが、それは私にとって選択肢ではありません。
どう思いますか?
Windowsの公式の推奨事項は何ですか?
MVVMパターンを、(それぞれのViewModelを使用して)数十の画面を持つアプリケーションに適用しています。今、私は非常に単純な点で立ち往生しています...新しいウィンドウを作成し、viewModelをインスタンス化し、互いに割り当てる責任があるのは誰ですか?
ビューまたはViewModelでこれを行うのは間違っていると思います。外部フレームワークの使用を勧める多くの返信を見ましたが、それは私にとって選択肢ではありません。
どう思いますか?
Windowsの公式の推奨事項は何ですか?
これが私がすることです:
mainviewmodel は、MEF を介してモジュールを構成します。
例を試してみましょう。ユーザーがボタンをクリックすると、はい/いいえで確認ダイアログ ボックスが表示されます。通常、ボタンのイベント ハンドラーで通知を発生させます。
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 コントロール間のすべてのブリッジを手動で構築できる確実な方法ですが、パターンは維持されます。