gpt4 book ai didi

c# - WPF 窗口导航使用 MVVM 但不是框架(甚至不是 MSFT)

转载 作者:行者123 更新时间:2023-12-03 10:44:29 28 4
gpt4 key购买 nike

只是为了不将其标记为重复。我发现了很多类似的问题,但它们依赖于框架的使用(第三部分或基于 MSFT)。还有一些人建议内置页面导航功能,这不是我想要的。

现在回到最初的问题。

我正在开发一个带有 MVVM 模式的 WPF 应用程序,没有 Prism 或任何框架,只是基本的 MVVM 概念。我希望从 Window 1 ( Login ) 导航到 Window 2 ( MainWindow ),然后返回到 Window1 ( Logout )。我试图了解实现这一目标的最佳方法。我不是在寻找解决方法,而是在寻找处理这种情况以更好地理解 MVVM 的概念方法。

最佳答案

Window MVVM 模式的导航有点棘手。该模式最适合 Page导航或 SPA(单页应用程序)用户界面。

但是,这并不意味着没有框架就无法完成。

首先,重要的是要注意没有代码隐藏是。不是 MVVM 中的点。这是关于将代码放在它所属的地方。因此,打开 Window来自 Button 的点击事件完全有效,因为它是 的一部分查看相关代码 .

private void Button_Clicked(object sender, RoutedEventArgs e)
{
MyView view = new MyView();
view.Show();
}

尽量不要陷入代码隐藏是坏代码的想法,因为它不是。

为了使您的 View 模型与窗口打开逻辑分开,最好将其封装在 中。服务 .让我们看一个非常简单的例子:
public interface IWindowService
{
void OpenView(object viewModel);
}

public class WindowService
{
public void OpenView(object viewModel)
{
//Use reflection to get the view based on the view model name.

//Open the view

//Set the DataContext to be the view model.
}
}

注意:我不会打扰太多代码,这纯粹是从概念的角度来看。

该服务非常简单,有一个方法需要一个 View 模型,并在此基础上找到关联的 View ,打开它,并设置 DataContext .真的很简单。

此服务可扩展处理 对话 等等。

为了使用这个服务,我们需要将它注入(inject)到 查看型号 ,这样的事情应该这样做:
public class MyViewModel
{
private IWindowService _WindowService;

public MyViewModel(IWindowService windowService)
{
_WindowService = windowService;
}

...
}

您可以使用 Dependency Injection要将服务注入(inject) View 模型,请参阅 here .这里需要注意的是,我使用的是 interface ,这让我可以抽象出窗口服务的实现,这当然是一件好事。

剩下的就是打开一个 View ,这可以通过调用 OpenView 来完成。方法:
SomeOtherViewModel myOtherViewModel = new SomeOtherViewModel();
_WindowService.OpenView(myOtherViewModel);

差不多就是这样。

关于c# - WPF 窗口导航使用 MVVM 但不是框架(甚至不是 MSFT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33353895/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com