我最近一直在用类似的问题困扰自己。最后我用来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
}
为了解释这段代码的作用以及为什么我这样编辑我的代码:
- 在制作我的应用程序时,我一直在关注应用程序内导航,例如后退 - 当我按下硬件后退按钮并进入上一个站点时,这些值没有改变,即使我在我后浏览的页面中更改了它们. 它们在模型中很好,但在“后浏览”时没有正确绑定。
当我试图解决它时,它最终来到了我身边。
刷新绑定所需要做的就是:
(因此,当创建第一页并尝试绑定数据时,仅通过 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
,将会有一个像这样创建的视图模型。它可以从每一页访问。