我在MVVM Light中使用MVVM模式。我有一个在App.xaml中定义的ViewModelLocator,它保存了使用Blend从视图中绑定的所有ViewModel。如何访问OnLaunched中App.xaml中定义的资源?
我有一个基本包含了所有我的应用程序的重要的全球信息,如用户的喜好的AppViewModel。 AppViewModel由ViewModelLocator实例化,然后由app.xaml实例化。
问题是,我需要从OnLaunched中访问AppViewModel,但是,在应用程序生命周期的这个阶段,它似乎app.xaml尚未实例化其声明的资源。它似乎只能在Frame.Navigate()之后执行此操作。
我需要访问AppViewModel因为我有检查,以找出要加载的页面上出现的属性。因此这是鸡与鸡蛋的情况。
如果我在OnLaunched内部单独实例化AppViewModel,则可以访问AppViewModel,但ViewModelLocator会实例化两次,这会导致IoC发生问题。
有手动实例里面的App.xaml申报项目的方式?或者有没有办法让app.xaml在呈现UI之前加载其资源?
还是我这样做不对?一般来说,我认为应用程序是视图模型层,视图本质上是观察...因此,我需要在呈现任何UI之前使用ViewModels。
XAML:
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</Application.Resources>
代码:
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
var vml = App.Current.Resources["Locator"] as ViewModelLocator; // exception raised
例外:
WinRT的信息:无法找到与给定值的资源。
感谢
因为应用需要是可共混的,这意味着它具有在XAML中声明。 – krisdyson
至少我认为它需要在App.xaml中声明才能在Blend中启用绑定! – krisdyson
不,它可以在App.xaml.cs中定义,也可以在你想要的任何地方定义。如果你想要访问你的'ViewModelLocator',你只需要将它添加到'Application.Resources'中。 –