オンラインで入手できるMVVMの例で一般的に言及されている基本的な設計パターンを使用して、すべてのMVVMアプリケーションを作成しています。私がフォローしているパターンを以下に説明します。
モデル
このセクションには、プロパティとインターフェイス IDataService などを含む DTO クラスが含まれます。
public class Employee
{
public string EmployeeName { get; set; }
public string EmployeeDesignation { get; set; }
public string EmployeeID { get; set; }
}
public interface IDataService
{
public Task<Employee> GetEmployeeLst();
}
プロキシー
このレイヤーには、次のような IDataservice を実装する Dataservice 呼び出しが含まれています。
public class DataService : IDataService
{
public async Task<Employee> GetEmployeeLst()
{
// Logic to get employee data from HTTPClient call
}
}
ビューモデル
このレイヤーには、ViewModel と、すべてのデータを受け取るモデルおよびプロキシ レイヤーへの参照が含まれています。
public class BaseViewModel
{
public BaseViewModel(INavigationService nav, IDataService data, IAESEnDecrypt encrypt, IGeoLocationService geoLocation, IMessageBus msgBus, ISmartDispatcher smtDispatcher)
{
}
// This also include common methods and static properties that are shared among most of the ViewModels
}
すべての ViewModel は BaseViewModel を継承します。各 viewModel には、UI がイベントをトリガーしたときに実行される Delegatecommand も含まれています。次に、プロキシ層で DataService を呼び出してサーバーからデータを取得し、ビジネス ロジックを実行して、ビューにバインドされた ViewModel にプロパティを設定します。ビューごとに、ビューのデータコンテキストにバインドされた VM があります。ViewModel はアニメーションの開始も担当します。トリガーを使用してストーリーボードを開始します。これは、VM の列挙型にバインドされ、これらのトリガーの状態変更のために次の例のようになります。 mvvm-Friendly-visual-state-management-with-windows-phone-7/
意見
このレイヤーには、GeoLocation Service、AES 暗号化、ビュー間の NavigationService などの特定の依存関係を実装したすべてのビュー、ユーザー コントロール、およびビジネス ロジックがあります。
すべてのビューには .xaml および .xaml.cs ファイルがあります。.xaml.cs ファイルで、ビューのデータ コンテキストを次のように VM にバインドしました。
this.DataContext = App.IOConatiner.GetInstance<DashboardViewModel>();
ここからすべてのバインディングが発生します。
私の問題は、最近、このパターンがSOLID設計パターンに従っていないという知識があったことです。これは、質問のこの回答で知ったものです: Simple InjectorはBaseClassに複数の依存関係を注入します
前の質問の回答で与えられた提案に従って、デザインを変更しようと懸命に努力しています。しかし、次のようなものを取得できません。
現在、View Datacontext は ViewModel にバインドされているため、すべてのコントロールは VM のプロパティによって制御されます。これを Processor/Service または DialogHandler を使用して上記のパターンに変更するにはどうすればよいですか?
UI 要素の command プロパティにバインドされた Delegatecommands を使用しています。これらのコマンドを実行するとアニメーションのように特定のアクションが発生し、ユーザーコントロールが表示されます。コマンドパターンでそれを行う方法は?
可能な限り最善のアプローチでこれらすべての変更に対応するために、現在の実装の変更を開始するにはどうすればよいですか?