簡體   English   中英

WPF在MVVM中打開單獨的窗口

[英]WPF open seperate windows in MVVM

我是WPF的新手,我正在嘗試保持MVVM模式。
我有一個主要的形式,它將呈現一些報告(以磁貼的形式,但這並不重要)。
因此,我希望用戶雙擊報告之一以在新的單獨窗口中打開報告。
我做了什么,我知道這不是正確的MVVM方法,因為我在ReportsmanagerViewModel中有此命令

Private Sub OpenReportExecute()
    Dim win As New ReportView
    win.Show()
End Sub

我不使用PRISM或任何其他框架。 如何在不破壞MVVM的情況下打開窗口?

MVVM應該避免從您的視圖模型中引用表示形式的程序集。 您需要從視圖模型中調用新窗口,那么如何打破依賴關系呢?

我們打破每個依賴關系的方式- 接口!

我通常稱其為交互服務,因為窗口是交互對象。 對此可能會有不同的意見。 YMMV等

public interface IDataInteractionService
{
    //Implementations will display the data SOMEHOW
    void DisplayData(Data d);
}

現在執行

//Displayed data using windows!
public class WindowedDataInteractionService: IDataInteractionService
{
    public void DisplayData(Data d)
    {
        new Window().ShowDialog(); //basic implementation shows a window.
    }
}

這里的技巧是,視圖模型不直接引用任何WPF程序集-這稱為間接 另外,您還有一個接口,因此可以放心地交換服務實現,而不會破壞視圖模型代碼。 這是SOLID原則的示例,使您的未來生活更加輕松。

您沒有使用PRISM或其他依賴項注入框架 ,因此面臨的挑戰是將服務引入您的視圖模型。 通常的做法是使用Singleton實現使IDataInteractionService於該應用程序。

這是一個示例,您應該如何使用C#進行操作,但是應該有一個操作方法: 在MVVM中打開一個新窗口

抱歉回答2次:)這是一個錯誤。 本示例中的方法是委托負責創建Windows對象的FactoryClass中的新Window的創建,將DataContext設置為它,並調用Show方法。 這樣您可以解決2個問題:

  1. 您的ViewModel不應打開其他Windows,並創建其他ViewModel

  2. 您可以在班級中解決依賴關系。 您將創建的Window放置在Factory類中。

這對於單元測試ViewModel非常重要。 由於存在很多依賴性,因此很難測試您的ViewModel。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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