MVVMLight ViewModelLocator 创建新的 ViewModel
MVVMLight ViewModelLocator to create new ViewModel
我一直在跟着mvvmlight
编码一个项目。我有 3 xaml
个文件 MainWindow
、View1
、View2
、
我已经在我的 ViewModelLocator
中注册了所有三个视图模型,以及 View1Model
使用的数据服务
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<IView1Service, View1Service>();
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<View1Model>();
SimpleIoc.Default.Register<View2Model>();
}
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>(Guid.NewGuid().ToString());
}
}
public View1Model View1
{
get
{
return ServiceLocator.Current.GetInstance<View1Model >(Guid.NewGuid().ToString());
}
}
public View1Model View2
{
get
{
return ServiceLocator.Current.GetInstance<View2Model >(Guid.NewGuid().ToString());
}
}
View1Model
需要一个IView1Service
作为构造函数输入,
public View1Model(IView1Service view1Service)
{
_view1_service = view1Service;
}
在我的 App.xaml
中,我已将它们注册如下
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
<DataTemplate DataType="{x:Type vm:View1Model}">
<views:view1 />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:View2Model}">
<views:View2 />
</DataTemplate>
</Application.Resources>
当然 View1
View2
是 MyProject.View
命名空间下的 xmal
个文件。
我试图初始化 MainViewModel
中的所有视图,所以我访问了 MainViewModel
中的所有视图模型实例
public MainViewModel()
{
// Add available pages
PageViewModels.Add(new View1Model(new View1Service())); // <========How to get this from the ViewModelLocator ?
PageViewModels.Add(new View1Model());
// Set starting page
CurrentPageViewModel = PageViewModels[0];
}
PageViewModels.Add(new View1Model());
在这行代码中,我希望从 ViewModelLocator
中获取它,而不是传递一个 View1Service
对象。但是我在 App.xaml
注册的 Locator
在这里无法访问,解决这个问题的最佳方法是什么?
我通过在我的 ViewModel 中创建 ViewModelLocator 作为私有字段来做到这一点
public class MyViewModel : ViewModelBase
{
private ViewModelLocator _locator;
public MyViewModel()
{
_locator = new ViewModelLocator();
}
}
然后您可以通过 ViewModelLocator 使用以下方法访问您的 ViewModel:_locator.View1
、_locator.View2
等
我使用 MVVMLight 开发通用应用程序,而不是 WPF。不过我想应该差不多吧
您不必显式创建 ViewModel 的新实例。它是一个单例,所以在第一次调用 ServiceLocator.Current.GetInstance<T>()
时会创建一个实例。
此外,SimpleIoc 足够聪明,可以找到合适的 class(匹配之前注册的类型,在本例中为 IView1Service
),如果它需要参数,则实例化。
您在App.xaml注册的Locator
在其他xaml中使用,如:
<Page
...
DataContext="{Binding View1, Source={StaticResource Locator}}"
>
在代码中获取ViewModel实例,就像@goobering的回答。
View1Model vm = (new ViewModelLocator()).View1;
创建多个ViewModelLocator实例是安全的,返回的ViewModel是同一个对象。
我一直在跟着mvvmlight
编码一个项目。我有 3 xaml
个文件 MainWindow
、View1
、View2
、
我已经在我的 ViewModelLocator
中注册了所有三个视图模型,以及 View1Model
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<IView1Service, View1Service>();
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<View1Model>();
SimpleIoc.Default.Register<View2Model>();
}
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>(Guid.NewGuid().ToString());
}
}
public View1Model View1
{
get
{
return ServiceLocator.Current.GetInstance<View1Model >(Guid.NewGuid().ToString());
}
}
public View1Model View2
{
get
{
return ServiceLocator.Current.GetInstance<View2Model >(Guid.NewGuid().ToString());
}
}
View1Model
需要一个IView1Service
作为构造函数输入,
public View1Model(IView1Service view1Service)
{
_view1_service = view1Service;
}
在我的 App.xaml
中,我已将它们注册如下
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
<DataTemplate DataType="{x:Type vm:View1Model}">
<views:view1 />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:View2Model}">
<views:View2 />
</DataTemplate>
</Application.Resources>
当然 View1
View2
是 MyProject.View
命名空间下的 xmal
个文件。
我试图初始化 MainViewModel
中的所有视图,所以我访问了 MainViewModel
public MainViewModel()
{
// Add available pages
PageViewModels.Add(new View1Model(new View1Service())); // <========How to get this from the ViewModelLocator ?
PageViewModels.Add(new View1Model());
// Set starting page
CurrentPageViewModel = PageViewModels[0];
}
PageViewModels.Add(new View1Model());
在这行代码中,我希望从 ViewModelLocator
中获取它,而不是传递一个 View1Service
对象。但是我在 App.xaml
注册的 Locator
在这里无法访问,解决这个问题的最佳方法是什么?
我通过在我的 ViewModel 中创建 ViewModelLocator 作为私有字段来做到这一点
public class MyViewModel : ViewModelBase
{
private ViewModelLocator _locator;
public MyViewModel()
{
_locator = new ViewModelLocator();
}
}
然后您可以通过 ViewModelLocator 使用以下方法访问您的 ViewModel:_locator.View1
、_locator.View2
等
我使用 MVVMLight 开发通用应用程序,而不是 WPF。不过我想应该差不多吧
您不必显式创建 ViewModel 的新实例。它是一个单例,所以在第一次调用 ServiceLocator.Current.GetInstance<T>()
时会创建一个实例。
此外,SimpleIoc 足够聪明,可以找到合适的 class(匹配之前注册的类型,在本例中为 IView1Service
),如果它需要参数,则实例化。
您在App.xaml注册的Locator
在其他xaml中使用,如:
<Page
...
DataContext="{Binding View1, Source={StaticResource Locator}}"
>
在代码中获取ViewModel实例,就像@goobering的回答。
View1Model vm = (new ViewModelLocator()).View1;
创建多个ViewModelLocator实例是安全的,返回的ViewModel是同一个对象。