【问题标题】:Do we have to create induvidual ViewModelLocators for each ViewModel?我们是否必须为每个 ViewModel 创建单独的 ViewModelLocators?
【发布时间】:2012-01-25 04:22:52
【问题描述】:

我们必须为不同的 ViewModel 创建单独的 ViewModelLocator 还是为所有 ViewModel 创建一个 ViewModelLocator。因为当我尝试通过为所有 ViewModel 设置属性来仅使用一个 ViewModelLocator 时 - 它会给出错误 - 在缓存中找不到类型。所以除非我将该视图模型设置为默认值,否则我无法使用该视图模型。谁能帮我确定我哪里出错了?

【问题讨论】:

  • 为了帮助您,我们至少需要查看视图模型定位器的代码。不过,从您写的内容来看,我假设您使用某种 IoC 容器,并且您要查找的类型不在此容器中……但这只是一个非常疯狂的猜测!

标签: mvvm mvvm-light


【解决方案1】:

您只需要一个 ViewModelLocator 并且需要类似这样的设置:

你应该有一个 ViewModelLocator.cs。

在您的 App.xaml 中对其进行初始化:

 <Application.Resources>
    <ResourceDictionary>
        <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
    </ResourceDictionary>
</Application.Resources>

您的视图也应该在每个页面的根 DataContext 调用您的 ViewModelLocator:

<phone:PhoneApplicationPage DataContext="{Binding MenuViewModel, Source={StaticResource Locator}}" .../>

【讨论】:

  • 我找到了解决方案 -> 每次我使用 mvvmlocator sn-p 时,它都会生成新的静态构造函数,我曾经删除过这个构造函数,最后出现上述错误,因为我没有使用 SimpleIoc 注册 ViewModel 的属性。我在默认构造函数中做到了,问题就解决了。
【解决方案2】:

我找到了更好的解决方案,MVVM-Light ViewModelLocator 的解决方法是使用 MEF 导出。 下面是 Johnpapa 提供的一个很好的链接... 清洁和简单的解决方案。 http://johnpapa.net/simple-viewmodel-locator-for-mvvm-the-patients-have-left-the-asylum

【讨论】:

    【解决方案3】:

    当我像您一样使用 MVVM Toolkit 并在我的视图模型的构造函数中使用 SimpleIoc 容器解析类型时,我在 Windows 8 商店应用程序中导致了此错误。这导致设计时体验显示您描述的错误。

    我通过检查我是否在设计时解决了这个问题,如果我在,则不执行代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      相关资源
      最近更新 更多