一个视图模型和多个视图

本文关键字:视图 模型 一个 | 更新日期: 2023-09-27 18:35:45

我有一些关于Windows Phone 8和MVVM模式的问题。

  1. 我想知道如何将许多显示页面中的元素绑定到一个 ViewModel(只有一个 ViewModel,因为我想使用外观模式)。

  2. 我看到的每个教程都包含视图模型和模型位于静态字段中的代码。我不确定这是否正确。有人可以告诉我应该在WP8应用程序中的哪个位置创建新的模型和视图模型才能正确执行此操作吗?(我所说的"正确"也意味着我可以将多个页面中的元素绑定到这个 ViewModel。我正在考虑 App.xaml.cs 文件,但仍然不确定。

感谢您的帮助!

一个视图模型和多个视图

我最近一直在为类似的问题而烦恼。最后,我使用App.xaml.cs来创建视图模型。

答案

是的,这是在 App.xaml.cs 中创建静态视图模型的正确方法,因为 App 类可以从应用程序中的任何页面访问,因此将它们声明为静态也是正确的,因为您将希望在不创建 App 实例的情况下访问它,并且正如 Tariq 在他的回答中写道:

ViewModel 和 Model 是静态字段,因此如果值超出范围,则不会销毁这些值。这进一步使从多个页面轻松更新成为可能。

编辑:请注意,当您在页面之间浏览并导航回来时,一旦您返回到内存中的页面,绑定不会自动恢复。

如何

我将其添加到RootFrame定义旁边的App.xaml.cs中:

private static MainViewModel viewModel; //not sure how your viewmodel class is named
public static MainViewModel ViewModel   //and a property to access it from
{
  get
  {
    if(viewModel == null)               //which creates the viewModel just before
       viewModel = new MainViewModel(); //it's first used
    return viewModel;
  }
}

当我想在我的页面中绑定某些内容时,jst 将其添加到页面的构造器中(在 InitializeComponents(); 之后):

DataContext = App.ViewModel;

如果要绑定,最好在OnNavigatedTo()中设置绑定(前提是构建资源成本不高 - 如果花费的时间或资源超过一些时间或资源,则应考虑重新设计 ViewModel,使其随时间加载)。

只需将其添加到您的页面:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);             //not needed, base method is empty and does nothing
        DataContext = null;                //important part, whenever you navigate, refreshes the ViewModel - no deletion, just resetting of the DataContext, so the page won't get stuck
        DataContext = App.ViewModel;      //and finally the resetting
    }

为了解释这段代码的作用以及为什么我像这样编辑我的代码:

  • 制作我的应用程序时,我一直在关注应用程序内导航,例如后退浏览 - 当我按下硬件后退按钮并到达上一个站点时,值保持不变,即使我在反向浏览的页面中更改了它们。它们在模型中很好,但在"反向浏览"时没有正确绑定。

当我试图解决它时,它最终来到了我身边。

刷新绑定所需要做的就是:

  • 再次设置它,并且由于在反向浏览时不调用页面的构造器,因此刷新它的唯一位置是OnNavigatedTo()事件。

  • 我测试了它,它可以工作

(因此,当创建第一个页面并尝试绑定数据时,视图模型仅由 get 请求自动创建:) )

在 xaml 中,我可以通过以下方式绑定:

<TextBlock text="{Binding SomePropertyNameFromViewModel}" />

<TextBlock text="{Binding SomeModelInViewModel.ItsProperty}" />

或例如:

<ListBox IemSource="{Binding SomeCollectionInViewModel}">
...rest omitted for brevity...

等等。。。

最好的东西是什么?它有效,而且相当容易。我正在通过几个命令和大约 6 或 7 个包含绑定属性和集合的模型将其用于 ViewModel,当用户浏览应用程序并指定要加载的内容时,这些模型会得到填充。

PS:据我所知,这是这样做的方法,即使是基本的 WP 枢轴应用程序也是这样做的。

您可以检查自己是否创建了一个空的透视应用程序并查看App.xaml.cs,将创建一个像这样的视图模型。而且可以从每个页面访问它。

我不是太有经验,但从我所做的工作来看:

是的,您可以使用 App.xaml.cs 文件从多个页面访问 ViewModel。视图模型将从所有页面接收更新。这就是它的美妙之处!

ViewModel 和 Model 是静态字段,因此如果值超出范围,则不会销毁这些值。这进一步使从多个页面轻松更新成为可能。