gpt4 book ai didi

wpf - 使用 MVVMC 模式的嵌套 Controller

转载 作者:行者123 更新时间:2023-12-04 21:10:56 29 4
gpt4 key购买 nike

我已经开始使用 MVVMC(也称为 MVCVM 或 MVVM+),它采用 MVVM 模式并在 View 、 View 模型和模型之间添加了一个 Controller 。 Controller 负责调用应用程序 API 来检索模型,然后将模型转换为 View 模型,然后将 View 模型绑定(bind)到其关联的 View 。这样,ViewModel 保持单一职责;向 View 提供数据。但是,我在使用这种方法时遇到了一些问题。

我有一个 MainWindowViewModel,它向 MainWindowView 提供数据。还创建了驱动此交互的 MainWindowController。问题在于 MainWindowView 中包含许多其他 View (例如 ItemsListView 的多个实例)并且这些 View 中包含更多 View 。

最初,我将所有必需的 View 模型添加到 MainWindowViewModel 中,以便每个 subview 都可以绑定(bind)到其父 View 模型的属性。基本上主窗口的所有 View 数据都保存在该 View 模型的单个实例中。使用这种方法,我将需要多个 Controller 来驱动所有这些交互。每个人还应该根据自己的逻辑实例化 View 模型。这是否意味着 MainController 应该实例化并保持对所有其他 Controller 的引用,它将用于填充主视图模型的内部 View 模型?这不会让 Controller 太拥挤吗?

另一种方法是对一个窗口内的所有 View 使用单个 Controller ,但这似乎违反了单一职责原则。

在 WPF 中以 MVVMC 模式实现 Controller 的正确方法是什么?

最佳答案

我假设所有这些内部 View 都是动态的,因为您使用了“交互”这个词。所以我认为最好为每个 View 设置不同的 Controller 。

我最近开发了一个 WPF MVVMC 框架。我将告诉您我如何在框架中处理您的问题类型。

在 View MainWindow.xaml 中:

<Window>
<mvmmc:Region ControllerID="View1"/><!-- View 1 -->
<mvmmc:Region ControllerID="View2"/><!-- View 2 -->
<mvmmc:Region ControllerID="View3"/><!-- View 3 -->
</Window>

Region 是一种特殊的 Control,具有动态内容,由 Controller 控制。 加载时, Controller 实例根据ControllerID创建, Controller 将确保创建View和ViewModel作为Region的内容。

现在,假设在 MainWindowViewModel 中,您想要更改 View1View2 的内容。代码是:

void ChangeContentOfView1AndView2()
{
_navigationService.GetController("View1").Navigate("SomeAction");
//Here's another way to find a controller and navigate
_navigationService.GetController<View2Controller>.OtherAction();
}

因此 MainWindowViewModel 可以在您的代码中找到控制某个 Region 的 Controller 并要求它导航。导航的逻辑,比如填充特定的 ViewModel 属于特定的 Controller 。不是 MainWindowViewModel

在这个简单的解决方案中,没有 MainWindowCotroller,因为 MainWindow 的 View 是静态的。无需 Controller 。 ViewModel 根据按钮按下或任何事件,找到 Region 的相关 Controller 并调用它。

在 View1Controller 中:

public class View1Controller : Controller
{
public void SomeAction()
{
ExecuteNavigation();
}
}

ExecuteNavigation 将找到一个名为 "SomeActionView" 的控件和一个名为 "SomeActionViewModel" 的 ViewModel 并将设置相关的区域的 内容作为 SomeActionView。其 DataContext 为 SomeActionViewModel


如果您正在寻找完整的 WPF 解决方案,请查看我在此处使用的 MVVMC 框架。导航有点类似于 Asp.NET Core。

带有文档的博文: http://michaelscodingspot.com/2017/02/15/wpf-page-navigation-like-mvc-part-2-mvvmc-framework/

GitHub: https://github.com/michaelscodingspot/WPF_MVVMC

关于wpf - 使用 MVVMC 模式的嵌套 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39997073/

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