この問題を解決する良い方法は、MVVM-Light Framework のコード テンプレートのように、"Viewmodel-Locator" クラスでビューモデルを作成して共有することです。MVVM Light には、ビューモデルとサービスのインスタンス化を管理する小さな IOC コンテナーが付属しています。以下にサンプル コードを示します。まず、静的な方法でサービスとビューモデルを登録します。
public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
//Resgister your Services
SimpleIoc.Default.Register<IDataService, SomeDataService>();
// Register your Viewmodels
SimpleIoc.Default.Register<SomeViewModel>();
}
登録済みの Viewmodel ごとにプロパティを作成して、viewmodelLocator クラスの外部からアクセスできるようにします。
public SomeViewModel SomeVM
{
get
{
return ServiceLocator.Current.GetInstance<SomeViewModel>();
}
}
次に、XAML で ViewmodelLocator クラスにアクセスするために、たとえば App.xaml で global リソースを作成します。
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</Application.Resources>
次のように、データ コンテキストをビューにバインドします。
DataContext="{Binding SomeVM, Source={StaticResource Locator}}"
最後に、viewmodel クラスで、サービスにアクセスして、必要なことを実行できます。
class SomeViewModel
{
private IDataService mDataService;
public SomeViewModel(IDataService _dataService)
{
mDataService = _dataService;
// Do the fancy stuff...
}
}
これが役に立てば幸いです!