[英]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個問題:
您的ViewModel不應打開其他Windows,並創建其他ViewModel
您可以在班級中解決依賴關系。 您將創建的Window放置在Factory類中。
這對於單元測試ViewModel非常重要。 由於存在很多依賴性,因此很難測試您的ViewModel。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.