[英]Using MvvmLight.Messaging.Messenger to instantiate new View + ViewModel (Window)
我有我的MainView
和一個關聯的MainViewViewModel
,它們由ViewModelLocator
鏈接。
在MainViewViewModel
有一個命令應該觸發一個新Window
打開,該Window
擁有自己的 View 和 ViewModel( NewView
和NewViewViewModel
)。
在我見過的很多例子中,建議使用 Mvvmlight 的Messenger
來做這樣的事情:
public class MainViewViewModel
{
private void OpenNewWindow()
{
Messenger.Default.Send(new NotificationMessage("NewView"));
}
}
然后注冊NewViewViewModel
並像這樣處理消息:
public class NewViewViewModel
{
public NewViewViewModel()
{
Messenger.Default.Register<NotificationMessage>(this, NotificationMessageReceived);
}
private void NotificationMessageReceived(NotificationMessage obj)
{
if (obj.Notification == "NewView")
{
NewView view = new NewView();
view.Show();
}
}
}
但是,這不起作用,因為 NewViewViewModel 尚未實例化(因此未向Messenger
注冊)。 此外,這不適合 MVVM,因為NewViewViewModel
負責創建NewView
。
什么是實現一個簡單的命令,它實例化的正確途徑,並打開它通過連接一個新的視圖和視圖模型對ViewModelLocator
和設置DataContext="{Binding NewView, Source={StaticResource Locator}}"
在NewView.xml
?
使用窗口服務:
您可以使用IWindowService
實現注入視圖模型,也可以使用靜態WindowService
類:
public static class WindowService
{
public static void OpenWindow()
{
NewView view = new NewView();
view.Show();
}
}
依賴注入顯然更適合在運行時對視圖模型和IWindowService
切換實現進行單元測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.