UWP + MvvmLight - 定义为App.xaml资源的ViewModelLocator在设计模式下返回Access Denied错误

时间:2016-02-21 10:52:26

标签: xaml mvvm win-universal-app mvvm-light viewmodellocator

我正在使用MVVMLight构建UWP应用程序,我在设计模式下遇到了ViewModelLocator问题。

我创建了ViewModelLocator:

public class ViewModelLocator
{
  public MainPageViewModel Main =>ServiceLocator.Current.GetInstance<MainPageViewModel>();


  static ViewModelLocator()
  {
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

    SimpleIoc.Default.Register<MainPageViewModel>();

    if (ViewModelBase.IsInDesignModeStatic)
    {
      SimpleIoc.Default.Register<IMainPageDataService, DesignMainPageDataService>();
    }
    else
    {         
      SimpleIoc.Default.Register<IMainPageDataService, MainPageDataService>();              
    }
  }
}

然后我宣布它为App资源:

<Application.Resources>
  <ResourceDictionary>
    <viewModels:ViewModelLocator x:Key="Locator"></viewModels:ViewModelLocator>  
  </ResourceDictionary>
</Application.Resources>

现在应该可以工作了,我应该可以将MainPageViewModel定义为MainPage DataContext,但Intellisense是强调的

<viewModels:ViewModelLocator x:Key="Locator"></viewModels:ViewModelLocator>

有错误

  

访问被拒绝。 (HRESULT异常:0x80070005(E_ACCESSDENIED))

我注意到,当我没有使用ViewModelBase.IsInDesignModeStatic属性时,它可以正常工作,我可以在MainPage上看到设计数据。 这样的事情有效:

public class ViewModelLocator
{
  public MainPageViewModel Main =>ServiceLocator.Current.GetInstance<MainPageViewModel>();


  static ViewModelLocator()
  {
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

    SimpleIoc.Default.Register<MainPageViewModel>();

    SimpleIoc.Default.Register<IMainPageDataService, DesignMainPageDataService>();
  }
}

您有什么想法来解决这个奇怪的问题吗?

2 个答案:

答案 0 :(得分:0)

嗯......我的环境出了问题。我在另一台机器上检查了它,它完美无瑕。

答案 1 :(得分:0)

我遇到了同样的问题,最后使用原生的UWP Windows.ApplicationModel.DesignMode.DesignModeEnabled修复了它,现在一切运行良好。

此外,我正在转向Prism,不清楚这是一个VS / Blend问题,还是一个MVVMLight问题,但是放慢找到更多我觉得更容易使用的项目和更加强大的Prism 6,比如它例如验证。