2012-02-20 11 views
1

私は他のビューで使用する患者リストのユーザーコントロールを持っています。しかし、患者の1つを選択すると、その選択はユーザコントロールのインスタンスを含むすべてのビューに伝播されます。各ビューを各ビューのユーザーコントロールの新しいインスタンスをインスタンス化するにはどうすればよいですか? 私はCを使用していますMVVMLight UserControlビューモデル - ビューごとにユーザーコントロールの新しいインスタンスを作成します。

+0

現在、ユーザーコントロールをどのように扱っているかを示すコード/ XAMLを投稿してください。 – ken2k

+0

私はコード/ XAMLをken2kの記述通りに見る必要があると思いますが、あなたがsiutuationのあなたの見解がwrogn方法であるかのように聞こえると言いました。 "各ビューを各ビューのユーザーコントロールの新しいインスタンスをインスタンス化するにはどうすればいいですか?"、各ユーザーコントロールに新しいインスタンスが必要ないのは確かですか?あなたと同様に、すべてのビューの共有モデルが必要です。つまり、見ている動作が意味を成すか、または各コントロールのユーザーコントロールにバインドされたモデルのインスタンスが必要です。 –

+0

下記の解決策をご覧ください。 –

答えて

3

あなたが言ったことから推測、私はあなたの静的インスタンスをあなたのロケータからPatientViewModelを返すと仮定したいと思います。これを解決するには、プロパティが呼び出されたときにビューモデルの新しいインスタンスが生成されることを確認します。

編集:ロケータ異なるインスタンス生成方法

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

      //if (ViewModelBase.IsInDesignModeStatic) 
      //{ 
      // // Create design time view services and models 
      // SimpleIoc.Default.Register<IDataService, DesignDataService>(); 
      //} 
      //else 
      //{ 
      // // Create run time view services and models 
      // SimpleIoc.Default.Register<IDataService, DataService>(); 
      //} 

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

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

     public MainViewModel StaticMain 
     { 
      get 
      { 
       return _staticMain ?? (_staticMain = new MainViewModel()); 
      } 
     } 
     private static MainViewModel _staticMain; 


     public MainViewModel NewMain 
     { 
      get 
      { 
       return new MainViewModel(); 
      } 
     } 

     public MainViewModel NewIocMain 
     { 
      get 
      { 
       return ServiceLocator.Current.GetInstance<MainViewModel>(Guid.NewGuid().ToString()); 
      } 
     } 

    public static void Cleanup() 
    { 
     // TODO Clear the ViewModels 
    } 
} 
  1. Mainプロパティでは、インスタンスを作成するためにLauentのSimpleIocコンテナを使用しています。このコンテナのプロパティの1つは、すべての型をシングルトンとして扱うことです。したがって、このVM生成メソッドを使用すると、ビュー全体でVMを共有します。

  2. プロパティはほとんど同じですが、Laurentのコンテナを使用する代わりに、ビュー間で共有されるVMの静的インスタンスも保持されます。

  3. プロパティNewMainプロパティはすべての呼び出しで新しいVMを作成するため、ビュー間でVMは共有されません。

  4. プロパティNewIocMainプロパティは、呼び出しごとに新しいVMを作成するため、VMはビュー間で共有されません。ただし、SimpleIocコンテナは作成されたインスタンスへの参照を保持します。このインスタンスは自動的に解放されません。不要になったらコンテナからインスタンスを削除するために、作成に使用したキー(Guid)を使用してSimpleIoc.Default.Unregister(key)にコールする必要があります。

代わりのSimpleIocあなたは明らかに別のIOCコンテナを使用することを選ぶことができます使用して - 例えばユニティとして - あなたのインスタンスが作成され、どのくらいの時間、彼らが生きているか詳細に制御することができます。これを除いて、私はyorの場合にNewMainのアプローチを選択します。

+0

新しいものを返すにはどうしたらいいですか?コードは何ですか? –

+1

@edianga編集を参照してください。 – AxelEckenberger

+0

IOCコンテナを使用する利点は何でしょうか?この場合、s/w開発のユニティですか? –

関連する問題