WPF 在 MVVM 中单独打开 windows
WPF open seperate windows in MVVM
我是 WPF 的新手,我正在努力保持 MVVM 模式。
我有一个主窗体,它将显示一些报告(以图块的形式但它真的无关紧要)。
所以我想如果用户双击其中一个报告以在新的单独 window.
中打开报告
我所做的并且我知道这不是正确的 MVVM 方法是我在 ReportsmanagerViewModel
中有这个命令
Private Sub OpenReportExecute()
Dim win As New ReportView
win.Show()
End Sub
我不使用 PRISM 或任何其他框架。
如何在不破坏 MVVM 的情况下打开 window?
MVVM 应避免从您的视图模型中引用表示程序集。您需要从视图模型中调用新的 window,那么如何打破依赖关系?
我们打破每个依赖的方式相同 - 一个接口!
我通常称其为 交互服务 ,因为 window 是一个交互对象。对此可能会有不同的看法。 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# 中,但你应该有一个想法如何做到这一点:Open a new Window in MVVM
抱歉回答了 2 次 :) 这是一个错误。此示例中的方法是在负责创建 Windows 对象的 FactoryClass 中委托创建新的 Window,为其设置 DataContext 并调用方法 Show。
有了这个你解决了 2 个问题:
您的 ViewModel 不应打开其他 Windows,并创建其他 ViewModel
您解决了 class 中的依赖关系。您将 Window 的创建放置在工厂 class.
中
这对于对 ViewModel 进行单元测试很重要。有很多依赖关系,很难测试你的 ViewModel。
我是 WPF 的新手,我正在努力保持 MVVM 模式。
我有一个主窗体,它将显示一些报告(以图块的形式但它真的无关紧要)。
所以我想如果用户双击其中一个报告以在新的单独 window.
中打开报告
我所做的并且我知道这不是正确的 MVVM 方法是我在 ReportsmanagerViewModel
Private Sub OpenReportExecute()
Dim win As New ReportView
win.Show()
End Sub
我不使用 PRISM 或任何其他框架。 如何在不破坏 MVVM 的情况下打开 window?
MVVM 应避免从您的视图模型中引用表示程序集。您需要从视图模型中调用新的 window,那么如何打破依赖关系?
我们打破每个依赖的方式相同 - 一个接口!
我通常称其为 交互服务 ,因为 window 是一个交互对象。对此可能会有不同的看法。 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# 中,但你应该有一个想法如何做到这一点:Open a new Window in MVVM
抱歉回答了 2 次 :) 这是一个错误。此示例中的方法是在负责创建 Windows 对象的 FactoryClass 中委托创建新的 Window,为其设置 DataContext 并调用方法 Show。 有了这个你解决了 2 个问题:
您的 ViewModel 不应打开其他 Windows,并创建其他 ViewModel
您解决了 class 中的依赖关系。您将 Window 的创建放置在工厂 class.
中
这对于对 ViewModel 进行单元测试很重要。有很多依赖关系,很难测试你的 ViewModel。