【问题标题】:WPF + MVVM with multi-windows handling具有多窗口处理的 WPF + MVVM
【发布时间】:2011-07-18 15:07:21
【问题描述】:

我正在看一个很好地解释 MVVM 的视频。但是,它似乎只显示了一个窗口应用程序模型。如果要处理多窗口模型,您需要做什么?

据我所知.. app.xaml 链接到 MainWindow(作为 DataContext)。由于 app.xaml 是它执行 MainWindow 的起点。 MainWindow 将 ViewModels 作为绑定,因此它可以处理他的 ViewModels.. 但所有这些仅适用于一个窗口.. 你想引入第二个窗口会发生什么?你如何进行?

谢谢。

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    您可以通过服务从主窗口视图模型中实例化您的视图 (Window) 类型,作为抽象注入。然后,您可以在服务中以编程方式设置此窗口的DataContext,找到适当的视图并使用myWindow.Show()myWindow.ShowDialog() 来显示窗口。 Caliburn.Micro 之类的 MVVM 框架有一个 WindowManager 用于处理视图位置和视图/视图模型绑定。

    【讨论】:

    • 您在谈论特定框架中的 WindowManager。但是您认为我们可以使用包含 Windows 列表的静态类来处理这个问题吗?
    • 是的,绝对是,但您可能希望使其基于实例并在视图模型中针对 IWindowManager 之类的抽象工作,因为您需要在单元测试中模拟对话框结果等内容.
    • 虽然这显然是一个可行的解决方案(在它“有效”的意义上),但这确实违反了 MVVM 的精神; MVVM 旨在保持功能和 UI 之间的界限非常明显,当您开始处理 ViewModel 中的 UI 元素时,您会模糊(如果不是彻底消除)这种区别。另一种非常常见的做法是将 ViewModel 完全放在另一个程序集中(以帮助保持此边界到位),这不允许您这样做。
    • @Adam_Robinson 嗯。是的,你没有错。实际上,通过使用 WindowManager,您可以以某种方式将 ViewModel 绑定到违反 MVVM 的 UI,如果您在说什么?
    • @Rushino:有几种方法可以满足您的要求;我这样做的方式使用 WPF 行为,但我还没有写过它,而且在一个答案中有点太多了。几个 MVVM/WPF 框架提供的将 ViewModel 映射到 View 的各种方式都很好,因为它们都被设计为允许 ViewModel 只处理 ViewModel 端,并且在较低级别进行映射。您想要的是直接在 ViewModel 中实例化一个 View 对象。这就是为什么拥有一个专用的 ViewModel 程序集是个好主意的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多