UWP + MvvmLight - 定义为 App.xaml 资源的 ViewModelLocator 在设计模式中返回拒绝访问错误
UWP + MvvmLight - ViewModelLocator defined as App.xaml resource is returning Access Denied error in Design Mode
我正在使用 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>();
}
}
}
然后我将其声明为应用程序资源:
<Application.Resources>
<ResourceDictionary>
<viewModels:ViewModelLocator x:Key="Locator"></viewModels:ViewModelLocator>
</ResourceDictionary>
</Application.Resources>
它现在应该可以工作了,我应该可以将 MainPageViewModel 定义为 MainPage DataContext,但 Intellisense 正在下划线
<viewModels:ViewModelLocator x:Key="Locator"></viewModels:ViewModelLocator>
有错误
Access is denied. (Exception from 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>();
}
}
你有解决这个奇怪问题的想法吗?
嗯...我的环境有问题。我在另一台机器上检查过它,它可以正常工作。
我 运行 遇到了同样的问题,并最终使用本机 UWP Windows.ApplicationModel.DesignMode.DesignModeEnabled
修复了它,现在一切正常。
此外,我正在切换到 Prism,不清楚这是 VS/Blend 问题还是 MVVMLight 问题,但我发现 Prism 6 更易于使用且更强大,例如它的验证。
我正在使用 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>();
}
}
}
然后我将其声明为应用程序资源:
<Application.Resources>
<ResourceDictionary>
<viewModels:ViewModelLocator x:Key="Locator"></viewModels:ViewModelLocator>
</ResourceDictionary>
</Application.Resources>
它现在应该可以工作了,我应该可以将 MainPageViewModel 定义为 MainPage DataContext,但 Intellisense 正在下划线
<viewModels:ViewModelLocator x:Key="Locator"></viewModels:ViewModelLocator>
有错误
Access is denied. (Exception from 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>();
}
}
你有解决这个奇怪问题的想法吗?
嗯...我的环境有问题。我在另一台机器上检查过它,它可以正常工作。
我 运行 遇到了同样的问题,并最终使用本机 UWP Windows.ApplicationModel.DesignMode.DesignModeEnabled
修复了它,现在一切正常。
此外,我正在切换到 Prism,不清楚这是 VS/Blend 问题还是 MVVMLight 问题,但我发现 Prism 6 更易于使用且更强大,例如它的验证。