【问题标题】:Two concurrent views with one ViewModel一个 ViewModel 的两个并发视图
【发布时间】:2014-09-08 21:44:41
【问题描述】:

我在阅读其他帖子时得到了不同的答案,但我说我有一个主要的 ViewModel,它处理两个相关的数据模型

public partial class Product
{
    public string ProductName { get; set; }
    public int TemplateID { get; set; }
    public virtual Template Template { get; set; }
}

public Template()
{
    this.Products = new ObservableCollection<Product>();
}
public int TemplateID { get; set; }
public string TemplateName { get; set; }
public virtual ObservableCollection<Product> Products { get; set; }
}

目前,有两个独立的视图和视图模型,一个显示所有数据“byTemplates”,另一个显示所有数据“byProducts”。两者都允许 CRUD 操作。为了摆脱重复的代码和命令,我想将这两个视图合并为一个。

我还需要两个 ViewModel 吗?我可以同时处理同一个数据实例吗? (所以如果我在“ByTemplates”视图下插入一些东西,并在保存到数据库之前切换到“ByProducts”,我仍然会看到我所做的所有更改吗?

编辑:

我目前正在使用标签来促进这一点。 我的观点在这里:

按产品标签

通过模板选项卡(用户可以选择一个模板,“关联产品”列表视图将显示链接到“模板”的所有产品)

【问题讨论】:

  • 您能否对视图的描述更准确一些?您的意思是它们具有相同的结构但不显示相同的数据?也许你可以建立一个UserControl 能够同时管理两者,但如果没有更多信息很难说。
  • 所以我认为你可以在一个公共基类中重构两个 VM 的代码,比如ProductTemplateViewModel,并保留 2 个 VM,每个视图一个,作为从它继承的类。至于视图本身,您可以使用UserControls 共享代码,但如果您只有一点点重复,这通常是不值得的。
  • 我想我关心的是保持它已经拥有的方式(2VM),共享命令,我担心我创建了太多的数据库实例。但是很感谢您的意见-猜想我一直都做得很好;P

标签: c# wpf mvvm


【解决方案1】:

您所说的很有可能,viewmodel 可以包含多个组合在一起的模型作为一个父视图模型,它取决于它有兴趣绑定的所有属性。 是否有两个单独的视图是一个设计讨论,但这不是强制性的。每个模型都不需要一个视图模型。拥有视图模型的目的是摆脱对特定业务模型的直接依赖,并根据 UI 需求合并和塑造数据。所以是的,你可以做你想做的事。 如果您想深入了解如何做,请分享详细的 xaml 和现有模型/视图模型,否则一切就绪。

【讨论】:

    【解决方案2】:

    我倾向于使用两个视图相互连接的单个视图模型。一个示例可能是相同数据的详细视图和摘要视图。

    在您描述的场景中,如果两个视图都使用相同的数据和方法,那么请确保将它们保留为一个视图模型。但是,如果您将每个命令参数化以处理子集,那么听起来分离会更好 - 我希望通过对公共元素进行基类来改进重用和维护,然后扩展到每个子集的特定视图模型来做到这一点。这也提供了更好的扩展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 2013-10-17
      • 2011-08-17
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      相关资源
      最近更新 更多