[4]MainPage.xaml.csを修正する
MainPage.xaml.csを開き、まずリスト2のように、Silverlightクライアントオブジェクトモデルのためのusingディレクティブを追加します。
using Microsoft.SharePoint.Client;
次にリスト3のように、すでに存在するMainPageクラスの上にAnnouncementItemクラスを追加します。
public class AnnouncementItem
{
public string Title { get; set; }
public DateTime Modified { get; set; }
}
このクラスでは、SharePointサイトの「お知らせ」リストのリストアイテムから取得したタイトルと更新日時を格納するための2つのプロパティを定義しています。
次にリスト4のように、MainPageクラスを修正します。
public partial class MainPage : UserControl
{
// (1)「お知らせ」リストアイテムコレクション
private ListItemCollection announcementListItems;
public MainPage()
{
InitializeComponent();
// (2)現在のクライアントコンテキストの取得
ClientContext context = ClientContext.Current;
// (3)[お知らせ]リストの取得
List announcementList = context.Web.Lists.GetByTitle("お知らせ");
context.Load(announcementList);
// (4)「お知らせ」リストアイテムの検索
CamlQuery query = new CamlQuery();
query.ViewXml = "<View><Query><OrderBy><FieldRef Name='Modified' Ascending='FALSE'/></OrderBy></Query></View>";
announcementListItems = announcementList.GetItems(query);
context.Load(announcementListItems);
// (5)クエリの非同期実行
context.ExecuteQueryAsync(new ClientRequestSucceededEventHandler(OnRequestSucceeded), null);
}
private void OnRequestSucceeded(object sender, ClientRequestSucceededEventArgs e)
{
// (6)メインUIスレッドに描画操作を依頼
Dispatcher.BeginInvoke(BindData);
}
private void BindData()
{
// (7)AnnouncementItemオブジェクトのリスト作成
List<AnnouncementItem> announcements = new List<AnnouncementItem>();
foreach (ListItem item in announcementListItems)
{
announcements.Add(new AnnouncementItem()
{
Title = item["Title"].ToString(),
Modified = Convert.ToDateTime(item["Modified"].ToString())
});
}
// (8)DataGridコントロールにバインド
dataGrid1.ItemsSource = announcements;
}
}
(1)にあるListItemCollectionクラスは、SharePointのリストアイテムを表すListItemクラスのオブジェクトコレクションを管理します。ここでは、「お知らせ」リストアイテムのコレクションを管理するために使用します。
(2)にあるClientContextクラスのCurrent静的プロパティにより、クライアントオブジェクトモデル実行のための現在のコンテキストを取得します。
(3)では、SharePointのWebサイトを表すWebクラスのListプロパティによって返されるListCollectionクラスのGetByTitleメソッドにより、特定のタイトル(ここでは「お知らせ」)を持つListクラスのオブジェクトを取得します。
(4)では、「お知らせ」リストに対してクエリを実行します。SharePointでは、リストに対するクエリのためにCAML(Collaborative Application Markup Language)と呼ばれるXML形式のスキーマを使用します。CamlQueryクラスのオブジェクトを生成し、ViewXmlプロパティでCAMLクエリを設定します。ここでは更新日時の降順でOrderByするように設定しています。そして、ListオブジェクトのGetItemsメソッドのパラメーターとしてCamlQueryオブジェクトを渡すことにより、リストに対するクエリを実行します。
なお、CAMLの詳細については、MSDNライブラリの「CAML (Collaborative Application Markup Language) の概要 」を参照してください。
Silverlight用のクライアントオブジェクトモデルでは、クライアントコンテキストに対するすべてのクエリは非同期で実行されます。(5)では、(3)と(4)でClientContextオブジェクトのLoadメソッドで予約しておいたクエリをExecuteQueryAsyncメソッドにより非同期実行します。ExecuteQueryAsyncメソッドは、成功時と失敗時のコールバックメソッドのデリゲートをパラメーターとして渡す必要があります。
成功時のコールバックメソッドとしてOnRequestSucceededメソッドを定義しています。このメソッドは、メインUIスレッドとは別のスレッドとして実行されるため、(6)ではメインUIスレッドに対して描画操作を依頼しています。
(7)では、CAMLクエリによって取得した「お知らせ」リストアイテムコレクション(announcementListItemsオブジェクト)をもとに、表示用のAnnouncementItemオブジェクトのリスト作成し、(8)でDataGridコントロールにバインドします。
以上で、サンプルは完成です。
