0

我正在为数据库使用普通模型(实体)并将它们绑定到视图。这对我很有用,但现在我有一个“特殊”要求,我认为 ViewModel 是正确的方式。

目前,我有一个包含许多项目(1:n)的组模型。所有组都从数据库加载到ObservableCollection<Group>中,以在LongListSelector中显示它们。要求是向LongListSelector添加第二行,其中包含组内的当前项目数。这并不难,但我认为它是 ViewModel 的正确位置。

我必须从组模型对象构建 ViewModel,但是正确的位置在哪里。我应该为页面的OnNavigatedTo中的每个组模型创建 ViewModel 对象吗?在这种情况下,我会在每次导航到页面时创建 ViewModel 对象集合。还有其他方法吗?

4

2 回答 2

1

这取决于。第一个问题是您将创建什么样的 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 实例的创建和管理与页面逻辑完全解耦,这种方案是最灵活和可扩展的(例如用它来实现设计时数据真的很简单)。

于 2013-06-11T19:52:09.927 回答
0

在哪里创建 ViewModel 有不同的方法。您是否使用任何流行的 MVVM 框架?在这种情况下,您应该遵循这些框架使用的说明和机制。

如果您想自己创建一个简单的 VM 并绑定它,您可以在不同的地方进行操作。如果您只想要一个 VM 的一个实例,您可以在 App.cs 类中创建它,将其公开,以便您可以从应用程序的任何部分访问它。如果您有多个不同的 VM,并且每个 VM 负责一个视图,则可以将每个 VM 的实例保留为单个页面的一部分,仅当用户导航到该页面时才在代码中创建它。您还可以在 XAML 资源中创建 VM 实例并从不同部分引用它们。目前尚不清楚您的用例到底是什么,但这些是常见的解决方案。

于 2013-06-11T00:43:36.873 回答