gpt4 book ai didi

c# - MVVM 使用工厂方法处理窗口管理

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

我将我的 Windows 的创建(显示)委托(delegate)给我的 WindowFactory,它将 ViewModel 附加到 View 并显示窗口。它被注入(inject)到我的 MainViewModel 构造函数参数中。

工厂本身很简单:

public class ProductionWindowFactory : IWindowFactory
{
public void CreateNewWindow()
{
PhoneWindow window = new PhoneWindow();
{
window.DataContext = new phoneWindowViewModel();
}
window.Show();
}
}

现在,我的目标是实现我的新窗口的更多功能,这将在某些按钮单击时发生 那个新窗口。

由于我对工厂一般来说还很陌生,所以我很难掌握一个概念:

示例:

我们有一个 查看A 有一个 ViewModelA 附在它上面。
该 View 有一个带有命令的按钮,告诉我们 窗厂显示一个新的 View B .

View B 有一个 ViewModelB 和一个关闭按钮,告诉它关闭 View B .

现在,因为我们不应该引用我们的 View B 在我们的 ViewModelB ,我们必须以某种方式让它知道它应该关闭哪个 View 。

I have come up with possible ideas / solutions, but I would really appreciate you letting me know which one follows the MVVM and Factory pattern "the most", and which one is usually used in such situations.


  • 让我们的 ViewModelB 获取创建 的 windowFactory 实例 View B 作为初始化参数,并在工厂中构建一个关闭 的方法 View B 并通过按钮单击-> 命令执行。
  • 创建 窗口管理器? 继承自 IWindowFactory 并构建一个 WindowManager 类,它扩展了我们的 的功能窗厂 , 并将其推送到 ViewModel 构造函数中,如上所述。
  • 还有其他我完全不知道的正确解决方案吗?

  • 请记住,以上只是一个例子。理想情况下,我想为我的 Windows 实现更多高级功能,并能够使用该工厂创建和管理多个不同的功能。

    我没有附加太多代码,因为我仍处于学习和决定应该使用哪种解决方案的阶段。

    编辑 - 关于可能的重复:

    我的问题与建议的副本不同,因为另一个问题只是关于管理关闭窗口-我的问题也是关于这样做,但遵循 工厂模式 .

    我已经指定了非常明确的指导方针,我试图实现的目标和方式与所链接的问题完全不同。

    最佳答案

    首先,答案是 .工厂的工作是创造新的对象,把它想象成一个精心制作的 new运算符(operator)。此外,遵循“最多”模式的想法本身就是有问题的。您使用模式是因为它们可以帮助您实现某些目标,例如你使用 mvvm 来尽可能地避开 coded-ui 测试,因为它们通常是脆弱的。

    话虽如此,如何处理它的 View 完全取决于 View 的 View 模型。

    示例:如果一个 View 模型需要关闭自己的窗口,请使用注释中说明的命令来完成。如果一个 View 有一个全部关闭按钮,它的 View 模型将依赖于某种窗口注册表,该注册表可以枚举所有打开的窗口以关闭全部关闭命令。

    在查看您的 View 模型时,尝试从应用程序的其余部分想出它需要哪些服务的想法,并将这些依赖项作为接口(interface)注入(inject)。在实现接口(interface)时,很可能会有多个类实现多个,例如WindowManager可能实现IWindowFactoryIWindowRegistry因此很容易将所有新创建的窗口放入打开的窗口列表中。该窗口将依赖于 IWindowRegistry也很可能在关闭时取消注册。

    关于c# - MVVM 使用工厂方法处理窗口管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40970801/

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