簡體   English   中英

使用 MvvmLight.Messaging.Messenger 實例化新的 View + ViewModel (Window)

[英]Using MvvmLight.Messaging.Messenger to instantiate new View + ViewModel (Window)

我有我的MainView和一個關聯的MainViewViewModel ,它們由ViewModelLocator鏈接。

MainViewViewModel有一個命令應該觸發一個新Window打開,該Window擁有自己的 View 和 ViewModel( NewViewNewViewViewModel )。

在我見過的很多例子中,建議使用 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

使用窗口服務:

MVVM 在分離項目時顯示來自 VM 的新窗口

您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM