【问题标题】:WPF two panel app - reuse or create new instance of panel VM?WPF 两个面板应用程序 - 重用或创建面板 VM 的新实例?
【发布时间】:2018-09-20 15:00:09
【问题描述】:

我有一个 WPF 应用程序,其主窗口包含两个面板。布局很标准。左侧面板是对象列表。右侧面板显示有关左侧面板中所选对象的信息。

现在我将左侧面板直接放在窗口的 XAML 中,尽管我认为它应该是它自己的 UC/View。右侧面板编码为 UC。主窗口的 ViewModel 有一个字段,即右侧面板的 VM(称为属性 VM)。属性 VM 封装了模型中所选对象的数据。

当在左侧面板中选择不同的对象时,我会看到两个选项: 1)实例化属性VM的新实例并从模型中加载相应的数据 2) 将模型中的相应数据加载到已有的属性VM中,并发出相应的变更通知【我当前的实现】

上述两个选项之间是否有优势或首选方式?我错过了更好的第三种选择吗? * 编辑 * 也许更好的问题是——这两种方法的优缺点是什么?

谢谢!

【问题讨论】:

    标签: wpf xaml mvvm


    【解决方案1】:

    您正在描述 MVVM 世界中非常标准的场景。我相信你有一个轻微的架构问题,当解决后会让这个问题变得毫无意义。您从中进行选择的“列表”应该已经是一个包含“对象”a.k.a 模型的视图模型列表。属性视图应该只是数据绑定到选定的 VM。

    【讨论】:

    • 好的,我和你一样在列表中是 VM 列表,而不是 M 对象。我以前见过这样做。因此,用户选择一个对象,或者更确切地说是一个包装该对象的 VM。然后在右侧窗格中,如何将视图绑定到选定的 VM?
    • 您将右窗格绑定到的源属性设置为所选对象。
    • @mm8 - 谢谢。我认为是这样,但一直没有考虑到这一点。当我第一次要求澄清时,我在考虑左窗格 VM 的上下文(列表项 VM 所在的位置,以及谁无权访问右窗格)。我很晚才意识到窗口虚拟机对双方都有可见性并充当链接。
    【解决方案2】:

    上述两个选项之间是否有优势或首选方式?

    并非如此,但创建一个新实例并将数据绑定属性设置为此实例可能更简单,而不是每次单击按钮时都尝试重用和更新现有实例的状态。

    如果您需要缓存实例,您可以使用 IoC 容器或自定义缓存容器来为您解析实例。例如,您可以将容器设置为始终返回同一类的相同实例或每次都返回一个新实例,具体取决于您的要求。

    但确实有“首选方式”。您的需求决定了解决特定问题或用例的最佳方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      相关资源
      最近更新 更多