每个视图模型应该由单个ViewModelLocator来处理吗?



我开始探索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>();
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新