“Windows Phone SharePoint 列表应用程序”模板的体系结构

了解使用 Windows Phone SharePoint 列表应用程序模板创建的项目的设计模式。 由 Windows Phone SharePoint 软件开发工具包安装的 Windows Phone SharePoint 列表应用程序模板旨在基于将项目的各部分分隔到不同组件中的模式来生成 Windows Phone 应用程序。 模板负责创建类和文件以建立模式,从而允许开发人员专注于扩展基于去哦特殊要求、业务逻辑和数据生成的项目。

Windows Phone SharePoint 列表应用程序模板和 MVVM 设计模式

Windows Phone SharePoint 列表应用程序模板为根据 View-Model-ViewModel (MVVM) 软件设计模式开发的基于 Silverlight 的 Windows Phone 应用程序生成一个 Visual Studio 2010 项目。 通过 MVVM 模式,可以对项目中的代码进行组织并划分为多个易于管理的层,并且可以独立地开发、测试和修改这些层。 这种开发模式对于 Windows Presentation Foundation (WPF) 和 Silverlight 项目特别有效,因为除了其他优点之外,该模式还允许给定应用程序的表示层减少对基础数据的刚性依赖,使开发人员能够适应不同环境(例如,Web 浏览器、移动设备界面或桌面应用程序)的表示层,同时保留相同的基础数据结构。

不同于更简单的方法(例如,在与 Silverlight 应用程序中的特定 XAML 相关联的代码隐藏文件中编写您的所有数据管理代码),根据 MVVM 模式组织项目需要投入额外的精力来规划和开发必要的类、继承模型以及模式的各组件之间通信的方法。 Windows Phone SharePoint 列表应用程序模板会处理此类初始配置和开发工作以便为您建立模式,使您能够自定义和扩展项目来快速开发一个功能性 MVVM 应用程序。

MVVM 模式的三个主要组件或层是"视图"、"模型"和"视图模型"。 在基于 Windows Phone SharePoint 列表应用程序模板的项目中,这些组件由各种项目文件实现,如图 1 所示

图 1. MVVM 模式中的 Windows Phone SharePoint 列表应用程序文件

采用 MVVM 模式的模板文件

以下各部分介绍与 Windows Phone SharePoint 列表应用程序模板中这些组件的实现有关的一些细节。

“模型”组件

MVVM 模式中的"模型"组件指用于表示应用程序数据的类和结构。 对于基于 SharePoint 列表的应用程序,列表及其项充当基础数据。 在 Windows Phone SharePoint 列表应用程序中,ListDataProvider 类处理连接到 SharePoint 列表的标准 SharePoint 客户端对象模型操作;例如,创建 ClientContext 类的一个实例并设置其属性。 模板中 ListDataProvider 类的具体实现细节取决于在基于该模板创建项目时在 SharePoint 手机应用程序向导的步骤中指定的选项。

派生出 ListDataProvider 类的基类 ListDataProviderBase 在 Microsoft.SharePoint.Phone.Application.dll 中)实现了针对 SharePoint 列表数据的缓存机制。 当从服务器检索列表项时,它们由 ListDataProvider 类在分配给手机应用程序的本地内存中缓存,当应用程序中需要这些项时,需要先检查缓存以节省资源和减少与服务器的数据往返。

如果要筛选从 SharePoint 列表中检索到的数据或指定要检索什么数据,您可以修改 ListDataProvider 类(在 ListDataProvider.cs 文件中)的代码。 为实现这些目的而可能修改的文件部分有 LoadDataFromServer 方法和静态 CamlQueryBuilder 类的实现。 您还可以从 ListDataProviderBase 类派生您自己的类。 如果您这样做,一定要从基类中实现抽象方法 LoadDataLoadItem,还要实现基类的 Context 属性成员,以提供合适的 get 访问器方法。

“视图”组件

MVVM 模式中的"视图"组件指应用程序的用户界面 (UI)。 在基于 Silverlight 的 Windows Phone 应用程序中,"视图"组件由 XAML 文件构建,用来对与 XAML 文件(用于实现事件处理程序和其他代码以确定用户如何与界面元素进行交互)相关联的 UI 元素和代码隐藏文件进行声明与资格验证。

在开发用于Windows Phone的 SharePoint 列表应用程序的上下文中,区分“视图”一词的两种感觉非常重要。 SharePoint 列表与一个或多个视图相关联,例如,列表的默认“所有项目”视图或基于日历列表模板的列表的“当前事件”视图。 这些视图表示在 SharePoint 列表中组织和显示列表项的方法。 根据 sharePoint 列表 (的类型以及自定义视图是否已添加到列表中,) 您的应用的目标,与列表关联的视图(如“所有任务”或“当前事件”)可供您在从模板创建项目时选择包含在 SharePoint Phone 应用程序向导中的应用程序中。 如果包含给定视图,模板将生成 PivotItem 控件 (包含在 Pivot 控件) 以呈现列表视图。

这种意义上的"视图"有别于它在模板的"视图"中的含义。 在基于 Windows Phone SharePoint 列表应用程序模板的项目中,"视图"(实现为项目的"视图"文件夹中的 XAML 文件)在概念上指 MVVM 模式的"视图"组件。 也就是说,项目中的"视图"表示给定实体的数据(或模型)的表示层。 在本例中,实体是一个 SharePoint 列表或一个 SharePoint 列表项。

虽然可以说,项目中的"列表"窗体 (List.xaml) 对应于与 SharePoint 列表相关联的默认视图,但是,仍应注意 SharePoint 列表的默认视图与"列表"窗体表示的"视图"之间的概念性区别,因为项目中的"列表"窗体不一定映射到服务器上列表的默认视图。 例如,如果您修改服务器上的默认列表视图(如指定一个给定排序顺序或只显示某些字段而不显示其他字段),这些修改将不显示在项目中构成"列表"窗体的 XAML 中。 您可以基于您在 SharePoint 电话应用程序向导中的选择(或基于您随后自定义的"列表"窗体),按照各项出现在应用程序的"列表"窗体中的顺序对其进行排序,而不管为与服务器上的 SharePoint 列表相关联的默认视图配置的顺序。

"列表"窗体表示 SharePoint 列表的视图(或表示层)。 其他三个视图文件与单个列表项有关,(通常)可以说它们对应于 SharePoint 列表项的列表项菜单中提供的窗体

  • "显示"窗体 (DisplayForm.xaml) 对应于 SharePoint 列表的"查看项目"窗体 (DispForm.aspx)。 此窗体表示 SharePoint 列表中某单独项的视图。

  • "编辑"窗体 (EditForm.xaml) 对应于 SharePoint 列表的"编辑项目"窗体 (EditForm.aspx)。 当公开一个给定项以供编辑时,此窗体提供该项目的视图。

  • "新建"窗体 (NewForm.xaml) 文件对应于 SharePoint 列表的"新建项目"窗体 (NewForm.aspx)。 此窗体为要创建并添加到列表中的给定项目提供视图。

默认情况下,基于 Windows Phone SharePoint 列表应用程序模板的项目中始终包含"列表"窗体。 基于在 SharePoint 电话应用程序向导中选择的列表操作(新建、显示或编辑)生成项目的“视图”文件夹中其他窗体的 XAML 文件。

ViewModel 组件

MVVM 模式中的 ViewModel 组件旨在用作一种代理以便于"视图"组件与"模型"组件之间的交互,同时消除两个组件之间的耦合以便更改其中一个不会对另一个产生不利影响。 严格地说,ViewModel 组件可视为表示层的一部分,因为它通常包括"塑造"层基础数据以在"视图"组件中显示的逻辑。 在基于 Windows Phone SharePoint 列表应用程序模板的项目中,ViewModels 实现用于将从"模型"组件(即从 ListDataProvider 类的一个对象)检索到的 SharePoint 列表数据绑定到作为"视图"组件一部分的 UI 控件(例如,"编辑"窗体)的代码。 根据用于显示来自列表的数据及数据类型(即,列表项的字段类型是文本或数值数据,还是类似于 SharePoint 选项字段的数据)的控件类型,ViewModel 首先处理或转换数据,以便可以将其绑定到给定 UI 控件。

特别是,项目中的 ViewModel 类(如 EditItemViewModel 类)是从基类 ViewModelBase(在 Microsoft.SharePoint.Phone.Application.dll 中)派生的,它实现 INotifyPropertyChanged 界面以便构成应用程序用户界面的 Silverlight 控制可以在基础数据中的值发生更改时得到更新,并且存储在 UI 控件中的值的更改可应用于基础数据(如果为控件配置了双向绑定)。

图 2 简要显示了 EditItemViewModel 类的类继承层次结构,以及"编辑"窗体中给定 UI 控件与 ViewModel 中对应字段的绑定。

图 2. EditItemViewModel 和 EditForm 类

EditItemViewModel 和 EditForm 类

EditForm 类(表示 MVVM 模式的"视图"组件)由两个文件来定义和实现,即 EditForm.xaml 文件和与之相关联的代码隐藏文件 EditForm.xaml.cs。 在 EditForm.xaml.cs 文件中,EditItemViewModel 类(表示 MVVM 模式的 ViewModel 组件)通过将 EditForm 类的 DataContext 属性设置为 EditItemViewModel 类的对象绑定到 EditForm.xaml.cs 文件中的"视图"。

基于 MVVM 模式的软件设计通常将业务逻辑和验证例程局限于此模式的 Model 组件。 不过,在基于 Windows Phone SharePoint 列表应用模板的项目中,一些通常被认为属于 Model 组件的操作已在 ViewModel 组件中实现,更加方便开发者扩展项目,但代价是数据层 (Model) 和表示层 (ViewModel) 之间的概念区别变得有点模糊。 例如,用于编辑和创建列表项的 ViewModel 类(即 EditItemViewModelNewItemViewModel 类)提供 Validate 方法,以便于开发者能够重写为实现对用户输入数据的验证。 (若要了解如何使用这些 ViewModel 实现数据验证,请参阅如何:在 Windows Phone SharePoint 应用中实现业务逻辑和数据验证.md。)

注意

ListDataProvider 对象只从服务器加载数据。 其他操作(如添加更新删除)是在 ViewModel 自身内执行,然后执行刷新调用来更新服务器中的 ViewModel 数据。 这种设计简化了代码。

App.xaml 文件和 Silverlight 应用模型

App.xaml 文件及其相关联的代码隐藏文件 App.xaml.cs 是托管 Silverlight 应用程序的标准组件。 使用 Silverlight 托管 API 的应用程序必须包含派生自 Silverlight 应用程序 类的类,才能实现 Silverlight 应用程序模型。 Application 类支持应用程序生命周期事件和用于管理资源(如图像、字符串和 XAML 模板)的设施。

有关您可能对项目中的 App.xaml.cs 文件所做的修改类型的信息,请参阅如何:在Windows Phone上存储和检索 SharePoint 列表项,了解如何在 App.xaml.cs 文件中实现事件处理程序以保留应用程序状态信息,以及如何:在Windows Phone应用程序中使用多个 SharePoint 列表以实例化和配置其他App.xaml.cs 中的 ListDataProvider 对象。

另请参阅