方法: Windows Phone の OData サービスを使用する

2012/02/09

このトピックでは、Windows Phone の OData クライアント ライブラリを使用して Windows Phone アプリケーションで Open Data Protocol (OData) フィードを使用する方法について説明します。

Windows Phone の OData クライアント ライブラリは、OData をサポートするデータ サービスに対する HTTP 要求を生成し、応答フィード内のエントリをクライアント上でオブジェクトに変換します。このクライアントを使用すると、Listbox や Textbox などの Windows Phone コントロールを OData データ フィードを含む DataServiceCollection<(Of <(<'T>)>)> クラスのインスタンスにバインドできます。このクラスは、DataServiceContext クラスが、コントロール内でデータに対して行われた変更と同期された状態になるように、各コントロールによって生成されたイベントを処理します。Windows Phone アプリケーションでの OData プロトコルの使用の詳細については、「Windows Phone の Open Data Protocol (OData) クライアント」を参照してください。

クエリによって、DataServiceCollection<(Of <(<'T>)>)> クラスに含まれるデータ オブジェクトが決まります。このクエリは、統合言語クエリ (LINQ) をサポートする DataServiceQuery<(Of <(<'TElement>)>)>、または URI (Uniform Resource Identifier) として指定されます。このクエリは、DataServiceCollection<(Of <(<'T>)>)> クラスの LoadAsync(IQueryable<(Of <<'(T>)>>)) メソッドのパラメーターとして指定されます。実行すると、このメソッドは、コレクションのデータ オブジェクトに具体化される OData フィードを返します。このコレクションがコントロールのバインディング ソースである場合、コレクションからのデータがコントロールによって表示されます。URI を使用した OData サービスのクエリの詳細については、OData の Web サイトにある OData: URI 表記ページを参照してください。

このトピックの手順は、次のタスクの実行方法を示します。

  1. 新しい Windows Phone アプリケーションを作成する。

  2. プロジェクトにデータ サービスへの参照を追加する

  3. OData サービスを照会し、結果をアプリケーション内のコントロールにバインドする。

注注:

この例では、DataServiceCollection<(Of <(<'T>)>)> バインディング コレクションを使用して、Windows Phone アプリケーションの 1 つのページに対する基本的なデータ バインドについて説明します。実行中に発生する可能性のある状態の変更時にこのアプリケーションのアプリケーション データを保持し、復元する方法については、「方法: Windows Phone の OData クライアントの状態を保持する」を参照してください。たとえば、Model-View-ViewModel (MVVM) デザイン パターンを使用し、実行中に状態を維持する複数ページの Windows Phone アプリケーションの例については、「チュートリアル: Windows Phone 用の MVVM で OData を使用する」を参照してください。

この例では、OData の Web サイトで公開されている Northwind サンプル データ サービスを使用します。このサンプル データ サービスは読み取り専用です。変更を保存しようとすると、エラーが返されます。

Windows Phone アプリケーションを作成するには

  1. ソリューション エクスプローラーの [ソリューション] を右クリックし、[追加] をポイントして [新しいプロジェクト] を選択します。

  2. [新しいプロジェクトの追加] ダイアログ ボックスで、[インストールされたテンプレート] ペインから [Silverlight for Windows Phone] を選択し、[Windows Phone アプリケーション] テンプレートを選択します。プロジェクトに「ODataNorthwindPhone」という名前を付けます。

  3. [新しい Windows Phone アプリケーション] ダイアログ ボックスで、[Windows Phone のターゲット バージョン] ドロップダウン ボックスから [Windows Phone 7.1] を選択します。

  4. [OK] をクリックします。Silverlight 用のアプリケーションが作成されます。

プロジェクトにデータ サービスへの参照を追加するには

  1. ODataNorthwindPhone プロジェクトを右クリックし、[サービス参照の追加] をクリックします。

    [サービス参照の追加] ダイアログ ボックスが表示されます。

  2. [アドレス] ボックスに以下の URI を入力し、[OK] をクリックします。

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

    パブリックな読み取り専用の Northwind サンプル データ サービスからメタデータ ドキュメントがダウンロードされます。

  3. [名前空間] ボックスに「Northwind」と入力し、[OK] をクリックします。

    これで、プロジェクトに新しいコード ファイルが追加されます。このコード ファイルには、データ サービスのリソースにオブジェクトとしてアクセスし、操作するためのデータ クラスが存在します。データ クラスは名前空間 ODataNorthwindPhone.Northwind に作成されます。System.Data.Services.Client.dll アセンブリへの参照も追加されます。

Windows Phone アプリケーションのユーザー インターフェイスを定義するには

  1. プロジェクトで、MainPage.xaml ファイルをダブルクリックします。

    MainPage クラスの XAML マークアップが開きます。このクラスは、Windows Phone アプリケーションのユーザー インターフェイスを作成する際に使用されます。

  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 クラスに次の MainPage_Loaded メソッドを追加します。

    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. MainPage クラスに次の customers_LoadCompleted メソッドを追加します。

    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 クライアントの状態を保持する」を参照してください。

表示: