我对Windows Phone 8和MVVM模式有一些疑问。
我想知道如何将多个显示页面中的元素绑定到一个ViewModel(只有一个ViewModel,因为我想使用Facade模式)。
我看到的每个教程都包含ViewModel和Model在静态字段中的代码。我不确定这是否正确。有人可以告诉我在WP8应用程序中应该创建新模型和ViewModel来做到这一点吗? (“右”我的意思是我可以将多个页面中的元素绑定到这个ViewModel。)我正在考虑App.xaml.cs文件,但仍然不确定。
感谢您的帮助!
答案 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是静态字段,因此如果超出范围,则不会销毁这些值。这进一步简化了从多个页面的更新。