5

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

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

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

谢谢你的帮助!

4

2 回答 2

10

我最近一直在用类似的问题困扰自己。最后我用来App.xaml.cs创建视图模型。

答案

是的,这是在 App.xaml.cs 中创建静态视图模型的正确方法,因为App可以从应用程序中的任何页面访问该类,将它们声明为静态也是正确的,因为您将要访问它没有创建 App 的实例,正如 Tariq 在他的回答中所写:

ViewModel 和 Model 是静态字段,因此如果超出范围,值不会被破坏。这进一步实现了从多个页面轻松更新。

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

如何

我将此添加到App.xaml.cs定义的旁边RootFrame

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...

等等...

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

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

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

于 2013-10-17T10:16:51.457 回答
1

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

是的,您可以使用 App.xaml.cs 文件从多个页面访问 ViewModel。ViewModel 将接收来自所有页面的更新。这就是它的美丽!

ViewModel 和 Model 是静态字段,因此如果超出范围,值不会被破坏。这进一步实现了从多个页面轻松更新。

于 2013-10-17T04:42:59.840 回答