一个ViewModel和多个视图

时间:2013-10-16 22:26:36

标签: c# mvvm windows-phone-8

我对Windows Phone 8和MVVM模式有一些疑问。

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

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

  3. 感谢您的帮助!

2 个答案:

答案 0 :(得分:9)

我最近一直在为类似的问题烦恼。最后,我使用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个模型包含用于绑定的属性和集合,当用户通过应用程序并指定要加载的内容时,这些模型会被填充。

P.S。:从我得到的这个方法来做到这一点,即使是基本的WP数据透视应用就是这样做的。

如果你创建一个空的数据透视应用程序来查看App.xaml.cs,你可以检查自己,会有一个像这样创建的视图模型。它可以从每个页面访问。

答案 1 :(得分:1)

我不是很有经验,而是从我做过的工作::

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

ViewModel和Model是静态字段,因此如果超出范围,则不会销毁这些值。这进一步简化了从多个页面的更新。