2011-11-13 41 views
1

我开始探索MVVM灯,并开始设计我不同的viemModels。我浏览了很长时间才知道我在找什么,但是我找不到它:-(。每个视图模型应该由单个ViewModelLocator处理吗?

我有一个示例是基于一个MainViewModel,它是在ModelViewLocator中处理的。在大多数情况下,我们将有超过一个视图模型,所以应该全部的ViewModels在一个单一的ViewModelLocator文件中定义或做我必须有每个视图一个ViewModelLocator

换句话说,我需要得到这个: MainViewModel - > MainViewModelLocator PictureViewModel - > PictureViewModelLocator


好吧,但有一个问题: 让我说,我有3 viewModels,我创建ViewModel1,2和3 在ViewModelLocation中,我已创建相同的结构作为MainViewModel为了创建它的实例,并创建一个主要属性访问Models实例。

我发现的问题是,如果我的每个视图对应于每个viewModels被设置为自己的datacontext作为ViewModelLocator.ViewModelx,视图实例是在设计时创建的,它使我麻烦,如果在我的构造函数view我需要调用一个从WCF服务获取数据的外部类。它会产生一个“实例创建错误”。

另一方面,如果在每个视图中,我绑定然后不是从ViewModelLocator.ViewModelx,而是作为直接ViewModelx然后我没有得到该错误,并更好地工作。

那么什么是properway做和逻辑路径:

1 - 是否MainViewModel应该创建所有其他视图模型的? 2 - ViewModelLocator中的每个View都必须绑定到它自己的MainStatic propery吗? 3 - 每个视图是否创建自己的ViewModel实例?

我这样做的方式是,ViewModel构造函数创建期间从外部类返回服务数据的View仅在将其直接绑定到ViewModel时才起作用,这样做是否有困难?

回答

4

通常不需要多视图模型定位器。常见的方法是创建一个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>(); 
     } 
    } 
} 
相关问题