2

ViewModelLocator の概念を理解しようとしています (MVVM Light では、どの MVVM フレームワークが使用されているかに関係なく、ViewModelLocator の一般的な概念に問題が適用されます)。それを使用する。

私が理解しているように、ビューはロケーターのシングルトン インスタンスのプロパティの 1 つをデータ コンテキストとして使用します。ロケーターはこれらのさまざまなプロパティを定義し、それぞれに適切なビューモデル インスタンスを返します。

それはすべて問題ありませんが、これらのビューモデルに、ビューが提示するはずのモデルデータを実際にどのように入力するかを理解するのに苦労しています.

たとえば、従業員のリストを表示するビューがあるとします。EmployeesView と EmployeesViewModel を作成できます。ViewModelLocator で、この EmployeesViewModel を返すプロパティを作成できます。

public EmployeesViewModel Employees
{
    get
    {
        return ServiceLocator.Current.GetInstance<EmployeesViewModel>();
    }
}

ここで、viewmodel には従業員のリストが必要なので、すべての従業員を返す何らかのデータサービスを作成し、それを ViewModelLocator のコンストラクターの Servicelocator に登録します。

public ViewModelLocator()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
    SimpleIoc.Default.Register<IDataService, AllEmployeesDataService>();
}

EmployeesView をインスタンス化すると、EmployeesViewModel がインスタンス化され、すべての従業員を返すデータサービスが挿入されます。

ただし、EmployeesView でクリックしたばかりの特定の従業員の詳細を表示したいと考えています。この従業員はおそらく、データベースなどから取得するための何らかの ID を持っています。

EmployeeDetailsView と EmployeeDetailsViewModel を作成し、ViewModelLocator にプロパティを追加できます。

public EmployeeDetailsViewModel EmployeeDetails
{
    return ServiceLocator.Current.GetInstance<EmployeeDetailsViewModel>();
}

そしておそらく、ViewModelLocator のコンストラクターにある種のデータサービスを登録します。

SimpleIoc.Default.Register<IDataService, EmployeeDetailsDataService>();

しかし、どの従業員の詳細を表示する必要があるかをデータサービスまたはビューモデルに伝えるにはどうすればよいでしょうか? 従業員 ID はどこに渡すのですか?

私はこれをすべて間違って見ていますか?何か良い例を知っている人はいますか?私が見つけることができるすべての例は、各ビューモデルの同じ単一のインスタンスを返すだけです。

4

2 に答える 2

0

私が使用する簡単な例は、ビューモデルのコンストラクターに挿入されるデータサービスを使用することです。そのデータ サービスは、オブジェクト (あなたの場合は従業員) の監視可能なコレクションを返します。同じビューにリスト ボックスと詳細グリッドを作成します。そのため、collectionviewsource を使用してスタイルと並べ替えを行うことができる監視可能なコレクションにリストボックスをバインドします。詳細については、表示したい必須フィールドを含むグリッドを作成します。リストボックスの選択した項目 (SelectedEmployee) のビューモデルにプロパティを作成し、それらをバインドします。次に、詳細グリッドを SelectedEmployee にバインドします。これにより、選択した従業員の値がフィールドに表示されます。

これをすべての CRUD 操作に使用でき、リストボックスの slecteditemchanged イベントをリレー コマンドにバインドし、必要に応じてビジネス ロジックを追加できます。もう 1 つの注意点は、これを分割して非同期操作をサポートできることです。リストボックスの選択されたアイテムの変更イベントを取得し、非同期取得関数を実行して選択されたアイテムを取得する別の実装があります。

これが役立つことを願っています

于 2013-11-14T18:12:42.007 に答える