質問があります:MVVMでViewModelを作成するのに最適な場所と方法はどこですか?
1)App.xaml.csで静的フィールドとして1回作成し、Appで使用しますか?
2)このページに移動するときは、常にPage.csに新しいViewModelを作成しますか?
3)その他のオプション
質問があります:MVVMでViewModelを作成するのに最適な場所と方法はどこですか?
1)App.xaml.csで静的フィールドとして1回作成し、Appで使用しますか?
2)このページに移動するときは、常にPage.csに新しいViewModelを作成しますか?
3)その他のオプション
MVVMでは、ViewModelがアプリケーションです。これは、通常、アプリケーションへのエントリポイントである単一のスタートアップViewModelがあり、通常、App.xaml.csOnStartup
コードでこのインスタンスを作成することを意味します。
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var app = new ShellView();
var context = new ShellViewModel();
app.DataContext = context;
app.Show();
}
時々、スタートアップウィンドウのコンストラクターでViewModelを作成するアプリケーションがありますが、スタートアップロジックがある場合は、それをコードに入れる必要があるため、これはあまり好ましくありません-ビューの後ろにも、そしてビューレイヤーにアプリケーションロジックを混在させるのは好きではありません。
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ShellViewModel();
}
}
方法に関係なく、MVVMを使用する場合、ViewModelはアプリケーションであり、Viewではないため、通常、ViewModelは何らかの方法でスタートアップのViewModelに接続されます。ビューは、ユーザーがアプリケーション(ViewModels)を操作するためのユーザーフレンドリーな方法にすぎません。
それを行うにはさまざまな方法があり、あなたの考えによって異なります。
個人的には、必要なすべてのオブジェクトを作成するように設計されたクラスが常にありますApp.xaml.cs
。クラスは基本的に、スプラッシュスクリーンが表示されている間、これらの時間のかかる起動手順を実行します。ここでViewsとViewModelsの両方を作成し、それらをリンクします
これにより、View-to-ViewModelのすべてのリンクが作成される唯一のポイントを持つことができ、何かを追加/削除した場合でも、簡単にそこに戻ることができます。
各ビューのコンストラクターでviewModelを初期化するアプローチは好きではありません。プロジェクトに15のビューがあるとすると、すべてのViewModelの初期化を確認する場合は、15の異なるファイルを参照する必要があります。
これはこれへの私の謙虚な参加です=)
依存性注入を使用して、次のように作成できます(DIコンテナーを使用していると仮定します)。
public partial class YourView : UserControl
{
public YourView (IYourViewModel viewModel)
{
InitializeComponent();
this.DataContext = viewModel;
}
}