Silverlight 如何为共享同一模型的多个视图创建视图模型?

Silverlight 如何为共享同一模型的多个视图创建视图模型?,silverlight,windows-phone-7,mvvm,Silverlight,Windows Phone 7,Mvvm,这是基于书中的示例: Gary McLean Hall的专业WPF和Silverlight MVVM 作者只强调如何为DB结构创建模型(以及如何为其实现DAL) 我正在寻找创建ViewModel的正确方法 以下是-我怀疑它不太完整,但该产品缺少ProductCode: 我的视图将是:显示/编辑产品、客户和订单视图的页面 我熟悉实现/使用INotifyPropertyChange和ObservableCollection的模型/视图模型,无需坚持 我的问题是: 如何创建视图模型,使它们共享同一个模

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

作者只强调如何为DB结构创建模型(以及如何为其实现DAL)

我正在寻找创建ViewModel的正确方法

以下是-我怀疑它不太完整,但该产品缺少ProductCode:

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

我的问题是:

  • 如何创建视图模型,使它们共享同一个模型
  • 如何管理ViewModels?我是否有一个主视图模型来聚合所有特定的视图模型?这与ViewModel状态保存和恢复有关
  • 我对如何处理这个问题特别感兴趣:订单模型有一个产品列表。我还必须为我的ProductsViewModel维护一个产品列表,该列表支持产品的显示/编辑视图。如何同步所有的数据?OrderModel是否应该只包含产品代码列表?在这种情况下意味着什么


    一般来说,我在这里关注的是:如何为实现具有多对多关系(如产品订单)的DB表的模型创建和管理ViewModels。我们是仅使用外键作为模型对象的一部分,还是使用对该外键所表示的整个其他模型对象的引用?

    对我来说,听起来您的想法是错误的。当您询问“如何为实现具有多对多关系的DB表的模型创建和管理ViewModels”时,听起来您是在从模型的角度考虑ViewModels。这是不对的。ViewModel是视图的模型,而不是模型。您不应该考虑为模型创建ViewModels,而应该考虑为视图创建VewModels

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

    考虑一个电子邮件应用程序,它有两个视图:摘要和详细信息。因为有两个不同的视图,所以您有两个不同的视图模型,即使两个视图都从相同的基础模型中提取数据

    Model                SummaryViewModel       DetailsViewModel
    -----                ---------------        ----------------
    RecipientAddress                            RecipientAddress
    SenderAddress        SenderAddress          SenderAddress
    Subject              Subject                Subject
    Content                                     Content
    
    现在Summary视图只是一个摘要,不显示RecipientAddress或内容,因此SummaryViewModel上不存在这些属性。“详细信息”视图显示更多信息,因此具有更多属性。同样的想法也回答了您关于外键的问题。外键在视图上永远不可见,因此不必成为ViewModel的成员。ViewModel只关心视图所需的内容

    在回答您的问题“如何管理视图模型”时:您没有。你不必这么做。ViewModel实例通常(并非总是)与视图有一对一的关系,因此您不需要管理它们。他们只会活得和风景一样长。您只需在加载视图时创建ViewModel的新实例(通常在OnNavigatedTo事件处理程序中,请参见下文)并将其存储在视图的DataContext中。如果加载了视图的两个实例,则有两个ViewModel。当视图被GC'ed时,ViewModel也会被GC'ed调用(如果不是,那么内存泄漏)

    最后,关于如何同步更改,在桌面Silverlight应用程序中,许多视图可能同时显示,这可能很棘手。幸运的是,在Windows Phone上,我们通常一次只能打开一个视图(尽管并非总是如此)。因此,我们可以简单地告诉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之类的工具包提供的消息传递基础结构


    希望这能有所帮助。

    保持每个ViewModel的独立性和轻量级是一条可行之路。根据显示给用户的视图,加载相应的视图模型。您能否给我一个简单的示例,说明如何为显示给定客户订单列表的视图实现OrderViewModel。ViewModel应该如何引用模型?关于视图-ViewModel的关系,我非常了解您。我感兴趣的是VIEW模型关系:“然后,你最终通过访问模型来实现你的VIEW模型,做任何需要做的事情。”这里要考虑的是,模型是如何在不同视图之间共享的,包括那些修改数据的视图。目前,我还没有考虑使用上面提到的任何工具包。这很好,你不需要工具包来做MVVM。有许多方法可以在不同的VM之间共享模型。例如,您可以遵循类型存储库模式()。根据您的场景,您可以在ViewModels中新建模型对象。我经常在我的应用程序中创建类服务来处理模型的创建和缓存(与存储库模式不同),这些模型可以根据ViewModels的要求进行请求。一般来说,我有这个想法,但让我们以前面介绍的对象模型为基础,举一个具体的例子。一般来说,我有这个想法,但让我们以ob为基础,举一个具体的例子