2017-06-12 55 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