【问题标题】:Should each view model be handled by a single ViewModelLocator?每个视图模型是否应该由单个 ViewModelLocator 处理?
【发布时间】:2011-11-13 17:43:12
【问题描述】:

我开始探索 MVVM 灯并开始设计我的不同 viemModels。我已经浏览了很长时间以找出我正在寻找的东西,但我无法得到它:-(。

我的一个示例基于单个 MainViewModel,它在 ModelViewLocator 内处理。在大多数情况下,我们将拥有多个视图模型,因此应该在单个 ViewModelLocator 文件中定义所有视图模型,还是每个视图都必须有一个 ViewModelLocator?

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


好的,但还有一个问题: 假设我有 3 个视图模型,我创建为 ViewModel1、2 和 3 在 ViewModelLocation 中,我创建了与 MainViewModel 相同的结构以创建它的实例,并创建了一个主要属性来访问 Models 实例。

我发现的问题是,如果与每个 viewModels 对应的每个 View 都设置为 ViewModelLocator.ViewModelx 自己的数据上下文,则视图实例是在设计时创建的,如果在我的视图的构造函数期间,它会给我带来麻烦我需要调用一个从 WCF 服务获取数据的外部类。它会生成“实例创建错误”。

另一方面,如果我在每个视图中绑定,则不是从 ViewModelLocator.ViewModelx 而是直接从 ViewModelx 绑定,那么我不会收到该错误并且工作得更好。

那么正确的做法和逻辑路径是什么:

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

我的做法是,在创建 ViewModel 构造函数期间从外部类返回服务数据的 View 只有在我将其直接绑定到 ViewModel 时才有效,这样做有麻烦吗?

【问题讨论】:

    标签: mvvm-light mvvm-toolkit


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-13
      • 2019-10-03
      • 1970-01-01
      • 2017-10-24
      • 2012-11-16
      • 1970-01-01
      • 2012-05-15
      • 2015-01-15
      相关资源
      最近更新 更多