1

私はMVVMライトの調査を開始し、さまざまなviemModelの設計を開始しています。私は長い間私が探しているものを見つけるために閲覧しましたが、私はそれを得ることができませんでした:-(。

私が持っているサンプルの1つは、ModelViewLocator内で処理される単一のMainViewModelに基づいています。ほとんどの場合、複数のviewModelがあるので、すべてのviewModelを単一のViewModelLocatorファイルで定義する必要がありますか、それともビューごとに1つのViewModelLocatorが必要ですか?

言い換えれば、これを取得する必要があります:MainViewModel-> MainViewModelLocator PictureViewModel-> PictureViewModelLocator


大丈夫ですが、1つの質問があります。ViewModel1、2、3として作成した3つのviewModelがあるとします。ViewModelLocationで、MainViewModelと同じ構造を作成して、そのインスタンスを作成し、メインプロパティを作成します。モデルインスタンスにアクセスします。

私が見つけた問題は、各viewModelsに対応する各ビューがViewModelLocator.ViewModelxとして独自のデータコンテキストに設定されている場合、ビューインスタンスは設計時に作成され、ビューのコンストラクター中に次のことを行う必要がある場合に問題が発生することです。 WCFサービスからデータを取得する外部クラスを呼び出します。「インスタンス作成エラー」が発生します。

一方、各ビューでバインドした場合、ViewModelLocator.ViewModelxからではなく、直接ViewModelxとしてバインドすると、そのエラーは発生せず、より適切に機能します。

それで、行うべき適切な方法と論理パスは何ですか:

1-MainViewModelは他のすべてのviewModelを作成する必要がありますか?2-各ビューは、ViewModelLocator内の独自のMainStaticプロパティにバインドする必要がありますか?3-各ビューはViewModelの独自のインスタンスを作成しますか?

私が行った方法は、ViewModelコンストラクターの作成中に外部クラスからサービスデータを返すビューは、ViewModelに直接バインドした場合にのみ機能するというものですが、問題がありますか?

4

1 に答える 1

4

通常、複数のビュー モデル ロケーターは必要ありません。一般的な方法は、1 つの ViewModelLocator を作成しApplication.Resources、App.xaml に追加して、アプリケーションのどこでも使用できるようにすることです。使用している各 ViewModel の ViewModelLocator にプロパティを作成するだけです。

以下は、MVVM Light 4 (ベータ) の IoC コンテナーを使用してビュー モデルをインスタンス化する例です。IoC コンテナーを使用しないこともできますが、より複雑なシナリオでは、コードが確実に簡素化されます。

public class ViewModelLocator
{
    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        SimpleIoc.Default.Register<MainViewModel>();
        SimpleIoc.Default.Register<DetailsViewModel>();
    }

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

    public DetailsViewModel DetailsViewModel
    {
        get
        {
            return ServiceLocator.Current.GetInstance<DetailsViewModel>();
        }
    }
}
于 2011-11-14T06:32:55.833 に答える