解决此问题的一个好方法是在代码templates of the MVVM-Light Framework中的“Viewmodel-Locator”类中创建和共享您的视图模型。 MVVM Light附带一个小型IOC容器,用于管理视图模型和服务的实例化。下面是一些示例代码: 先注册服务和的ViewModels以静态方式:
public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
//Resgister your Services
SimpleIoc.Default.Register<IDataService, SomeDataService>();
// Register your Viewmodels
SimpleIoc.Default.Register<SomeViewModel>();
}
请为每个注册的ViewModels的属性从viewmodelLocator类的外部访问它们:
public SomeViewModel SomeVM
{
get
{
return ServiceLocator.Current.GetInstance<SomeViewModel>();
}
}
接下来,在App.xaml中创建一个全局资源,以访问XAML中的ViewmodelLocator类。
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</Application.Resources>
绑定在你看来这样您的DataContext:
DataContext="{Binding SomeVM, Source={StaticResource Locator}}"
最后,在你的视图模型类,你可以访问你的服务,做任何你需要做的:
class SomeViewModel
{
private IDataService mDataService;
public SomeViewModel(IDataService _dataService)
{
mDataService = _dataService;
// Do the fancy stuff...
}
}
希望这是有帮助的!
如果你使用MEF,您可以导出视图模型为单身人士达到同样的目的。与Unity同上。 – Gusdor
我喜欢App.xaml中globel资源的想法 – Felix