这取决于。第一个问题是您将创建什么样的 ViewModel 类。我认为为每个页面创建一个 ViewModel 类是一个很好的约定,例如为MainPage
您创建一个名为MainPageViewModel
.
这MainPageViewModel
应该负责从数据库加载数据,最好是在其构造函数中。而且因为您必须使用项目计数来扩展您的组,您也可以为您的组创建一个 ViewModel 类,称为GroupViewModel
,并且MainPageViewModel
会有一个称为 Groups 类型的属性ObservableCollection<GroupViewModel>
。
另一个有趣的问题是在哪里实例化MainPageViewModel
? 我看到三种不同的方法:
1 直接在 XAML 中创建 ViewModel
您可以在页面中创建 ViewModel 实例并直接使用它,DataContext
如下所示:
<Page xmlns:local="using:MyApp">
<Page.DataContext>
<local:MainPageViewModel />
</Page.DataContext>
...
</Page>
我认为这可能是最糟糕的解决方案,因为它需要 ViewModel 具有无参数构造函数(这种情况很少见),而且它非常不灵活,您无法控制何时创建 ViewModel 实例。
2 在后面的代码中实例化 ViewModel
您可以像这样在代码中简单地创建 ViewModel 实例:
this.DataContext = new MainPageViewModel();
您可以在构造函数中执行此操作 - 这样将为每个页面实例创建一个 ViewModel 实例 - 或在 OnNavigatedTo 事件处理程序中 - 这样每次用户导航到您的页面时都会创建一个新的 ViewModel 实例。
这种方法更灵活一些,但是将代码放在页面后面的代码中,这在纯 MVVM 中应该避免。然而,这个解决方案可能是最简单的。
3 ViewModelLocator 模式
最后一个解决方案是最复杂的,需要最多的代码,但在我看来也是最好的。
您将需要一个类,其唯一目的是创建 ViewModel 实例,称为ViewModelLocator
,它为每个页面的 ViewModel 定义属性:
class ViewModelLocator
{
MainPageViewModel MainPageViewModel
{
get
{
return new MainPageViewModel();
}
}
}
定位器的一个实例必须在 App.xaml 中创建为静态资源:
<Application.Resources>
<ResourceDictionary>
...
<local:ViewModelLocator x:Key="ViewModelLocator" />
</ResourceDictionary>
</Application.Resources>
然后,您可以简单地将这个实例的属性绑定到您页面上的 DataContext:
<Page DataContext="{Binding MainPageViewModel, Source={StaticResource ViewModelLocator}}">
...
</Page>
这样,每次创建页面时,MainPageViewModel
都会调用 ViewModelLocator 类的属性。在上面的示例中,我以每次创建一个新实例的方式实现了该属性,但是为了在每种情况下重用一个实例,很容易修改它。
通过这种模式,ViewModel 实例的创建和管理与页面逻辑完全解耦,这种方案是最灵活和可扩展的(例如用它来实现设计时数据真的很简单)。