1

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

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

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


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

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

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

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

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

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

4

1 回答 1

4

通常不需要多个视图模型定位器。常见的方法是创建一个 ViewModelLocator,然后将其添加到Application.ResourcesApp.xaml 中,以便在应用程序的任何位置使用它。只需在 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>();
        }
    }
}
于 2011-11-14T06:32:55.833 回答