gpt4 book ai didi

silverlight - 如何为共享同一模型的多个 View 创建 ViewModel(s)?

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

这是基于书中的示例:
Gary McLean Hall 的 Pro WPF 和 Silverlight MVVM

作者只坚持如何为数据库结构创建模型(以及如何为它实现 DAL)。

我正在寻找创建 ViewModel(s) 的正确方法。

这里是 database model and the MVVM Model - 我怀疑它不是很完整,但产品缺少 ProductCode:

我的 View 将是:显示/编辑产品、客户和订单 View 的页面
我熟悉实现/使用 INotifyPropertyChange 和 ObservableCollection 的模型/ View 模型,无需坚持。

我的问题:

  • 如何创建 ViewModel 以使它们都共享相同的模型
  • 如何管理 ViewModel?我是否有一个聚合所有特定 View 的主视图模型?这与 ViewModel 状态保存和恢复有关。

  • 我对如何处理这个问题特别感兴趣 :订单模型有一个产品列表。我还必须为我的 ProductsViewModel 维护一个产品列表,它支持产品的显示/编辑 View 。怎么能全部同步? OrderModel 是否应该只有一个 ProductCode 列表?在这种情况下有什么影响?

    一般来说,我在这里追求的是: 如何为实现具有多对多关系的数据库表的模型创建和管理 View 模型(如产品订单) .我们是只使用外键作为模型对象的一部分,还是使用对由该外键表示的整个其他模型对象的引用?

    最佳答案

    对我来说,这听起来像是你在思考错误的方式。当您问“如何为实现具有多对多关系的数据库表的模型创建和管理 ViewModels”时,听起来您正在从模型的角度考虑 ViewModels。这是不对的。 ViewModel 是 View 的模型,而不是 Model。你不应该考虑为你的模型创建 ViewModel,你应该考虑为你的 View 创建 VewModel。

    事实上,模型甚至直到最后才出现。从您的 UI 开始 - 您的 View 。然后,您可以在代码中创建该 View 的逻辑表示,以便您可以绑定(bind)到它,即您的 ViewModel。最后你通过访问你的模型来实现你的 ViewModel 来做任何需要做的事情。当你开始设计下一个 View 时,即使它可能包含一些与第一个相同的数据,你仍然会为它创建一个新模型——另一个 ViewModel。现在新的 ViewModel 可以在第一个 ViewModel 中包含一些相同的属性,这很好。请记住,是 View 的模型而不是模型。

    考虑一个电子邮件应用程序,具有 2 个 View 、摘要和详细信息。因为有 2 个不同的 View ,所以即使它们都从同一个底层模型中提取数据,你也有 2 个不同的 View 模型。

    Model                SummaryViewModel       DetailsViewModel
    ----- --------------- ----------------
    RecipientAddress RecipientAddress
    SenderAddress SenderAddress SenderAddress
    Subject Subject Subject
    Content Content

    现在摘要 View 只是一个摘要,不显示收件人地址或内容,因此这些属性在 SummaryViewModel 上不存在。详细信息 View 显示更多信息,因此具有更多属性。同样的想法回答了您关于外键的问题。外键在您的 View 上永远不可见,因此您的 ViewModel 成员没有任何业务。您的 ViewModel 只关心 View 所需的内容。

    回答您的问题“您如何管理 View 模型”:您没有。你不必。 ViewModel 实例通常(并非总是)与 View 具有一对一的关系,因此您不需要管理它们。只要 View 存在,它们就会存在。您只需在加载 View 时创建 ViewModel 的新实例(通常在 OnNavigatedTo 事件处理程序中,见下文)并将其存储在 View 的 DataContext 中。如果加载了两个 View 实例,则有两个 ViewModel。当 View 被 GC 时,ViewModel 也是(如果不是你有内存泄漏)。

    最后,关于您应该如何同步更改,这在可能同时显示许多 View 的桌面 Silverlight 应用程序中可能会很棘手。幸运的是,在 Windows Phone 上,我们通常一次只打开一个 View (尽管并非总是如此)。所以我们可以简单地告诉我们的 ViewModel 在每次页面导航到时刷新:
    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
    base.OnNavigatedTo(e);

    if (DataContext == null)
    DataContent = new MyViewModel(); //Create new instance of the ViewModel
    else
    (MyViewModel)DataContext.Refresh(); //Refresh the existing ViewModel
    }

    在大多数情况下,这适用于更高级的场景,您可以查看由 Prism 或 MvvmLight 等工具包提供的消息传递基础设施。

    希望这有帮助。

    关于silverlight - 如何为共享同一模型的多个 View 创建 ViewModel(s)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6754010/

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