导出 (0) 打印
全部展开

如何使用 Windows Phone 的 OData 服务

2012/2/9

本主题介绍如何通过采用 Windows Phone 的 OData 客户端库,以在 Windows Phone 应用程序中使用开放数据协议 (OData) 源。

Windows Phone 的 OData 客户端库可生成对以下数据服务的 HTTP 请求:该数据服务支持 OData,并将响应源中的条目转换为客户端上的对象。使用此客户端,您可以将 Windows Phone 控件(例如 Listbox 或 Textbox)绑定到包含 OData 数据源的 DataServiceCollection<(Of <(<'T>)>)> 类实例。此类可处理控件引发的事件,以使 DataServiceContext 类与控件中的数据所进行的更改保持同步。有关将 OData 协议用于 Windows Phone 应用程序的更多信息,请参阅 Windows Phone 的开放数据协议 (OData) 客户端

通过查询,可确定 DataServiceCollection<(Of <(<'T>)>)> 类将包含哪些数据对象。此查询指定为支持语言集成查询 (LINQ) 的 DataServiceQuery<(Of <(<'TElement>)>)>,或指定为统一资源标识符 (URI)。该查询指定为 DataServiceCollection<(Of <(<'T>)>)> 类的 LoadAsync(IQueryable<(Of <<'(T>)>>)) 方法中的参数。此方法在执行时,可返回被具体化为集合中的数据对象的 OData 源。如果集合是控件的绑定源,则控件将显示该集合中的数据。有关使用 URI 查询 OData 服务的更多信息,请参阅 OData 网站上的 OData:URI 约定页。

本主题中的过程演示如何执行以下任务:

  1. 创建新的 Windows Phone 应用程序。

  2. 添加对项目的数据服务引用。

  3. 查询 OData 服务并将结果绑定到应用程序中的控件。

注意注意:

此示例演示通过使用 DataServiceCollection<(Of <(<'T>)>)> 绑定集合对 Windows Phone 应用程序中的单个页面的基本数据绑定。有关如何在状态更改(可能在执行期间发生)过程中保留和还原此应用程序中的应用程序数据的信息,请参阅如何保留 Windows Phone 的 OData 客户端状态。有关使用模型视图查看模型 (MVVM) 设计模式同时还在执行期间保持状态的多页面 Windows Phone 应用程序的示例,请参阅演练:在 Windows Phone 中结合使用 OData 和 MVVM

此示例使用在 OData 网站上发布的 Northwind 示例数据服务。此示例数据服务是只读的;如果尝试保存更改,则将会返回错误。

创建 Windows Phone 应用程序

  1. “解决方案资源管理器”中,右键单击“解决方案”,指向“添加”,然后选择“新建项目”

  2. “添加新项目”对话框的“已安装的模板”窗格中,选择“Silverlight for Windows Phone”,然后选择“Windows Phone 应用程序”模板。将项目命名为 ODataNorthwindPhone。

  3. “新建 Windows Phone 应用程序”对话框的“目标 Windows Phone 版本”中,选择“Windows Phone 7.1”

  4. 单击“确定”。这将为 Silverlight 创建应用程序。

添加对项目的数据服务引用

  1. 右键单击 ODataNorthwindPhone 项目,然后单击“添加服务引用”

    这会显示“添加服务引用”对话框。

  2. “地址”文本框中输入以下 URI 值,然后单击“转到”

    http://services.odata.org/Northwind/Northwind.svc/
    

    这会从公共的只读 Northwind 示例数据服务中下载元数据文档。

  3. “命名空间”文本框中键入 Northwind,然后单击“确定”

    这会向该项目添加一个新的代码文件,该文件包含的数据类用来以对象形式访问数据服务资源并与之进行交互。这些数据类在命名空间 ODataNorthwindPhone.Northwind 中创建。此外,还会添加对 System.Data.Services.Client.dll 程序集的引用。

定义 Windows Phone 应用程序用户界面

  1. 在该项目中,双击 MainPage.xaml 文件。

    这将打开作为 Windows Phone 应用程序用户界面的 MainPage 类的 XAML 标记。

  2. 将现有的 XAML 标记替换为以下标记,该标记用于定义显示客户信息的主页面的用户界面。

    <phone:PhoneApplicationPage
        x:Class="ODataNorthwindPhone.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:my="clr-namespace:ODataNorthwindPhone.Northwind"
        mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" 
        d:DataContext="{d:DesignInstance Type=my:Customer, CreateList=True}"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        shell:SystemTray.IsVisible="True" Loaded="MainPage_Loaded">
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
                <TextBlock x:Name="ApplicationTitle" Text="Northwind Sales" 
                           Style="{StaticResource PhoneTextNormalStyle}"/>
                <TextBlock x:Name="PageTitle" Text="Customers" Margin="9,-7,0,0" 
                           Style="{StaticResource PhoneTextTitle1Style}"/>
            </StackPanel>
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <ListBox x:Name="MainListBox" Margin="0,0,-12,0" ItemsSource="{Binding}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Margin="0,0,0,17" Width="432">
                                <TextBlock Text="{Binding Path=CompanyName}" TextWrapping="NoWrap" 
                                           Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                                <TextBlock Text="{Binding Path=ContactName}" TextWrapping="NoWrap" 
                                           Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                                <TextBlock Text="{Binding Path=Phone}" TextWrapping="NoWrap" Margin="12,-6,12,0" 
                                           Style="{StaticResource PhoneTextSubtleStyle}"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </Grid>
        </Grid>
    </phone:PhoneApplicationPage>
    

添加将数据服务数据绑定到 Windows Phone 应用程序中的控件的代码

  1. 在该项目中,打开 MainPage.xaml 文件的代码页,然后添加以下 using 语句:

    using System.Data.Services.Client;
    using ODataNorthwindPhone.Northwind;
    
    
  2. 将以下声明添加到 MainPage 类中:

    // Declare the data service objects and URIs.
    private NorthwindEntities context;
    private readonly Uri northwindUri =
        new Uri("http://services.odata.org/Northwind/Northwind.svc/");
    private DataServiceCollection<Customer> customers;
    
  3. 将以下 MainPage_Loaded 方法添加到 MainPage 类中:

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        // Initialize the context and the binding collection 
        context = new NorthwindEntities(northwindUri);
        customers = new DataServiceCollection<Customer>(context);
    
        // Define a LINQ query that returns all customers.
        var query = from cust in context.Customers
                    select cust;
    
        // Register for the LoadCompleted event.
        customers.LoadCompleted
            += new EventHandler<LoadCompletedEventArgs>(customers_LoadCompleted);
    
        // Load the customers feed by executing the LINQ query.
        customers.LoadAsync(query);
    
    }
    
    

    在加载该页时,此代码会初始化绑定集合和内容,然后注册方法以便处理由绑定集合引发的 DataServiceCollection<(Of <(<'T>)>)> 对象的 LoadCompleted 事件。

  4. 将以下 customers_LoadCompleted 方法添加到 MainPage 类中:

    void customers_LoadCompleted(object sender, LoadCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            // Handling for a paged data feed.
            if (customers.Continuation != null)
            {
                // Automatically load the next page.
                customers.LoadNextPartialSetAsync();
            }
            else
            {
                // Set the data context of the list box control to the sample data.
                this.LayoutRoot.DataContext = customers;
            }
        }
        else
        {
            MessageBox.Show(string.Format("An error has occurred: {0}", e.Error.Message));
        }
    }
    

    在处理 LoadCompleted 事件时,如果成功返回请求,则会执行以下操作:

有关如何在状态更改(可能在执行期间发生)过程中保留和还原应用程序数据的信息,请参阅如何保留 Windows Phone 的 OData 客户端状态

显示:
© 2014 Microsoft