繁体   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