私の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();
}
ViewModelLocatorではなくデータバインディングを使用する必要があります。 – BoltClock
簡単な例がありますか? – devha
http://stackoverflow.com/questions/9362332/mvvmlight-usercontrol-view-model-create-new-instance-of-user-control-for-each-vi。答えの#4を書き留めます。 IOCコンテナ内のビューモデルをクリーンアップする場合は、必要に応じてOnNavigatedFromの登録を解除します。 –