我开始探索MVVM光,并开始设计我不同的viemModels。我已经浏览了很长时间,以找出我正在寻找的东西,但我无法得到它:-
我的一个示例基于单个MainViewModel,它在ModelViewLocator中处理。在大多数情况下,我们将有一个以上的viewModel,所以所有的viewModel应该在一个单一的ViewModelLocator文件中定义,还是我必须有一个ViewModelLocator每个视图?
换句话说,我需要得到这个吗?MainViewModel -> MainViewModelLocatorPictureViewModel -> PictureViewModelLocator
好的,但是还有一个问题:假设我有3个viewmodel,我已经创建为ViewModel1, 2和3在ViewModelLocation中,我创建了与MainViewModel相同的结构,以便创建它的实例,并创建了一个主属性来访问模型实例。
我发现的问题是,如果我的每个视图对应于每个viewModels被设置为自己的数据上下文作为ViewModelLocator。ViewModelx,视图实例是在设计时创建的,如果在视图的构造函数期间,我需要调用从WCF服务获取数据的外部类,这会让我感到麻烦。生成一个"实例创建错误"。
另一方面,如果在每个视图我绑定然后不是从ViewModelLocator。ViewModelx,而是直接ViewModelx,然后我没有得到那个错误,工作得更好。
那么属性路径和逻辑路径是什么呢?
1 - MainViewModel应该创建所有其他viewModel吗?2 -每个视图必须绑定到它自己的MainStatic属性在ViewModelLocator ?3 -每个视图创建自己的ViewModel实例吗?
我所做的是,我的视图返回服务数据从一个外部类在ViewModel构造器的创建工作只有当我绑定它直接到ViewModel,它有麻烦这样做吗?
通常不需要多个视图模型定位器。常见的方法是创建一个ViewModelLocator,然后将其添加到App.xaml中的Application.Resources
中,以便可以在应用程序中的任何地方使用它。只需在ViewModelLocator中为你正在使用的每个ViewModel创建一个属性。
下面是一个使用MVVM Light 4 (beta)中的IoC容器实例化视图模型的例子。你也可以不使用IoC容器,但在更复杂的情况下,它肯定会简化你的代码:
public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<DetailsViewModel>();
}
public MainViewModel MainViewModel
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
public DetailsViewModel DetailsViewModel
{
get
{
return ServiceLocator.Current.GetInstance<DetailsViewModel>();
}
}
}