2016-05-12 18 views
0

私のUWPアプリケーションでは、MVVM LightとViewModelLocatorを使用してViewModelsを取得しています。MVVM LightからユニークなViewModelsを取得する正しい方法ViewModelLocator

私のViewModelLocatorは、次のようになります.imはGUIDをGetInstanceに渡して一意のVMを取得します。

public class ViewModelLocator 
    { 
     static ViewModelLocator() 
     { 
      ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 
      SimpleIoc.Default.Register<MyViewModel>(); 
     } 
     public MyViewModel MyVM => ServiceLocator.Current.GetInstance<MyViewModel>(Guid.NewGuid().ToString()); 
    } 

自分のアプリケーションでこのユーザーコントロールのインスタンスを複数持つことができるため、固有のVMを必要とするusercontrolがあります。 ViewModelを取得する方法は次のとおりです。

<UserControl x:Class="My.App.Controls" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      DataContext="{Binding Path=MyVM, Source={StaticResource ViewModelLocator}}"> 
      ... 
</UserControl> 

これは、固有のVMを取得する正しい方法ですか?または、私のユーザーコントロールがこれ以上使用されなくても、VMはキャッシュされ、処分されませんか?

UPDATE

だから、私のコードはOK働くようです、私はユニークなmyvmにインスタンスを毎回取得します。

ここで問題は、ビューモデルを登録解除/廃棄する正しい方法は何かです。

私はSimpleIoc.Default.Unregister(guid)でそれを行うことができますが、私の現在の実装では、ユーザーコントロールにGuid(VMの作成で使用された)を配布するのはあまり簡単ではないので、VMの登録を解除できます。

全体的には、SimpleIocを使用してVMランタイムのViewModelLocatorを作成した場合、依存性注入を失うこと以外の欠点はありますか?

public class ViewModelLocator 
    { 
     public MyViewModel MyVM => new MyViewModel(); 
    } 
+0

ViewModelLocatorではなくデータバインディングを使用する必要があります。 – BoltClock

+0

簡単な例がありますか? – devha

+0

http://stackoverflow.com/questions/9362332/mvvmlight-usercontrol-view-model-create-new-instance-of-user-control-for-each-vi。答えの#4を書き留めます。 IOCコンテナ内のビューモデルをクリーンアップする場合は、必要に応じてOnNavigatedFromの登録を解除します。 –

答えて

0

あなたのUserControlをいくつかのビュー(ウィンドウ)で使用する必要があると仮定します。

Viewを制御しているViewModelは、UserControlに必要なViewModelを生成できます。 UserControlをこの 'SubViewModel'プロパティにバインドすることもできますが、それでも処分することができます。

関連する問題