MVVMパターンを守っている間にダイアログを開くことは、定期的な質問(ここや他の箇所)の1つと考えられます。 MVVMのようなフレームワークがあることは知っていますが、私はその問題の答えを持っていますが、私は現在、学習のために自分で大部分の作業をしようとする非常に小さな個人的なプロジェクトに取り組んでいます。MVVMを強制するビューモデルのプロジェクトを別にする:どのようにダイアログを開くのですか?
私は参照に注意を払うために、UIプロジェクトからビューモデルを抽出し、別のアセンブリに配置することにしました。 UIプロジェクトはUI.ViewModelsを参照しますが、それ以外の方法では参照できません。これは、私にはダイアログウィンドウを開く(モーダル)に問題がありました。
多くの人々はの線に沿って何かをしDialogService
を使用しているように見える:
internal class DialogService : IDialogService
{
public bool? OpenDialog(ViewModelBase vm)
{
Window window = new Window();
window.Content = vm;
return window.ShowDialog();
}
}
対応するウィンドウの内容がDataTemplate
を使用して、ビューモデルタイプから推測することができます。
私のシナリオでは、DialogService
がUIプロジェクトにある必要があるため、これは機能しませんが、ビューモデルから呼び出す必要があります。もちろん、DI/IoCを悪用してIDialogService
の実装をビューモデルに挿入することもできますが、それは私がしたいことではありません。
これを動作させる厳密な方法はありますか?代替案として
、私は私のViewModelBase
に次のコードを追加しました:
public abstract class ViewModelBase : INotifyPropertyChanged
{
...
public event Action<ViewModelBase, Action<bool?>> Navigate;
protected virtual void OnNavigate(ViewModelBase vm, Action<bool?> callback)
{
Navigate?.Invoke(vm, callback);
}
}
を、その上でより多くの過負荷、他のパラメータ、EventArgs
とがあるかもしれません。私はおそらくインターフェイスにこれを置くべきでしょう。しかし、これまでのところ「思考」に過ぎません。
(たとえば、NavigationService
で解決するか、下記を参照して)ビューインスタンスを作成するときに、NavigationService
にそのイベントを登録させてコールバックを呼び出すことができます。 これは問題のある/悪い考えですか?これの短所は何ですか?これまで(あまりテストしなかった)私が気に入らないことの1つは、ダイアログを開いた後に次の行に進むことができず、コールバックコード内で続行する必要があるということです。それはまた、コードを読むことによってプログラムの流れに従うことをより困難にする。
ご迷惑をおかけして申し訳ありません。これは非常に興味深い話題です.SOに関するこれらの質問に対する多くの回答がかなり古いので、現在のベストプラクティスについてもっと学びたいと思っています。
MVVM(https://www.youtube.com/watch?v=OqKaV4d4PXg)のダイアログを使用して、私の最近のビデオを見たい場合があります。これは一般的な問題ですが、比較的簡単に解決できます。サービスロケータパターンやその他の方法を使用することもできるため、サービスの注入方法(または使用方法)を決める必要があります。注射だけではありません。 –