2017-06-12 477 views
0

我不知道如何在MainWindowViewModel的构造函数调用中注入参数。我想要的是在viewmodellocator中注册当前主窗口(this)的一个实例。我怎样才能做到这一点?如何使用mvvmlight处理依赖注入

这是我在viewmodellocator类情况:

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

    //SimpleIoc.Default.Register<Window>(); //THIS IS NOT WORKING BECOUSE ITS A NEW INSTANCE, I NEED THE INSTANCE OF THE CURRENT MAINWINDOW HERE. 
    SimpleIoc.Default.Register<MainWindowViewModel>(); 
} 

MainViewModel:

public MainWindowViewModel(Window window) 
{ 
    this.Window = window; 

    //Listen out for the window resizing 
    this.Window.StateChanged += StateChanged; 
} 

MainWindow.xaml

DataContext="{Binding MainWindow, Source={StaticResource Locator}}" 
+0

顺便说一句,你是通过提供一个视图引用您的视图模型打破了整个MVVM概念。视图模型不应该关注视图。 – dymanoid

回答

1

如果你想有一个Window解析为您MainWindow

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

    SimpleIoc.Default.Register<System.Windows.Window>(() => System.Windows.Application.Current.MainWindow as MainWindow); 
    SimpleIoc.Default.Register<MainViewModel>(); 
} 

还要注意的是,你应该在你的XAML只绑定至“主”:

DataContext="{Binding Main, Source={StaticResource Locator}}" 
+1

许多感谢mm8!这正是我所期待的。现在就像魅力一样。最后,我对DI有更多的了解。你在这里使用的是我相信的工厂模式。我必须从事这方面的工作。关于你的第二个评论。我使用配置而不是约定,所以我在定位器中也命名了我的属性MainWindow。这是没有问题的,并且工作正常。非常感谢您的快速响应。我很高兴,我希望你也是:) – RocketRon

+1

正如你可以看到mm8我刚刚upvoted并标记为解决! – RocketRon