В этой статье я расскажу о потреблении и сохранении состояния OData в Windows Phone. О OData можно прочитать здесь . Я буду использовать сервис Northwind, предоставляемый OData
Давайте напишем код:
Шаг 1. Создайте новый проект приложения для Windows Phone. Выберите Silverlight для установленных шаблонов Windows Phone.
Шаг 2: Добавьте сервисную ссылку Nothwind.svc и назовите ее Northwind
http://services.odata.org/Northwind/Northwind.svc/
Шаг 3: Поместите ListBox на панель содержимого Grid в MainPage.Xaml
<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>
Шаг 4: Добавьте ниже, используя директиву в MainPage.Xaml.cs. Второе использование директива это пространство имен проекта и имя ссылки на сервис.
using System.Data.Services.Client; using WP_Consuming_OData.Northwind;
Шаг 5: Определите ниже переменных уровня класса.
public partial class MainPage : PhoneApplicationPage
{
private NorthwindEntities context;
private readonly Uri northwindUri =
new Uri(http://services.odata.org/Northwind/Northwind.svc/);
private DataServiceCollection<Customer> customers;
private bool isDataLoaded;
Шаг 6: Добавьте метод ниже в MainPage.Xaml.cs, который будет вызываться при восстановлении приложения. Переменная isDataLoaded для проверки того, что данные уже находятся в памяти, если данные не находятся в памяти, будет проверен словарь состояний для загрузки, если данные не присутствуют в словаре состояний, также будет вызвана служба OData.
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
// Get the object data if it is not still loaded.
if (!this.isDataLoaded)
{
object storedState;
DataServiceState state;
if (this.State.TryGetValue("DataServiceState", out storedState))
{
// Deserialize the DataServiceState object.
state = DataServiceState.Deserialize(storedState as string);
var restoredContext = (NorthwindEntities)state.Context;
// Set the binding collections from the stored collection.
var restoredCustomers = state.RootCollections["Customers"] as DataServiceCollection<Customer>;
this.LoadData(restoredContext, restoredCustomers);
}
else
{
this.LoadData();
}
}
}
Шаг 7: Добавьте нижеприведенный метод в MainPage.Xaml.cs, который будет сериализовать и хранить состояние передачи данных.
protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
{
var collections = new Dictionary<string, object>();
collections.Add("Customers", customers);
this.State["DataServiceState"] = DataServiceState.Serialize(context, collections);
}
Step 8: Now add below LoadData method in MainPage.Xaml.cs which will be invoked when stored data context is used to bind.
public void LoadData(NorthwindEntities context, DataServiceCollection<Customer> customers)
{
this.context = context;
this.customers = customers;
this.isDataLoaded = true;
}
Шаг 9: Метод LoadData в MainPage.Xaml.cs будет вызван для загрузки данных из сервиса в первый раз, и если контекст не сохранен в состоянии страницы.
private void LoadData()
{
context = new NorthwindEntities(northwindUri);
customers = new DataServiceCollection<Customer>(context);
var query = from cust in context.Customers select cust;
customers.LoadCompleted += new EventHandler<LoadCompletedEventArgs>(customers_LoadCompleted);
// Load the Customers feed by executing the LINQ query.
customers.LoadAsync(context.Customers);
}
Шаг 10: Добавьте ниже метона в MainPage.Xaml.cs, который происходит, когда загрузка данных завершена.
void customers_LoadCompleted(object sender, LoadCompletedEventArgs e)
{
if (e.Error == null)
{
if (customers.Continuation != null)
{
customers.LoadNextPartialSetAsync();
}
else
{
this.LayoutRoot.DataContext = customers;
this.isDataLoaded = true;
}
}
else
{
MessageBox.Show(string.Format("An error has occurred: {0}", e.Error.Message));
}
}
Шаг 11: Теперь запустите приложение и дождитесь загрузки данных и привязки к списку, а затем нажмите кнопку Пуск.
Вы получите исключение Northwind.NorthwindEntities не может быть сериализовано, как показано ниже.
Теперь откройте файл Reference.cs, доступный по указанному ниже пути.
Добавьте ниже, используя директиву в Reference.cs
using System.Runtime.Serialization
Now add [DataContract] attribute to NorthwindEntities class
[DataContract]
public partial class NorthwindEntities : global::System.Data.Services.Client.DataServiceContext
{
Шаг 12. Теперь запустите приложение и дождитесь загрузки данных и привязки к списку, а затем нажмите кнопку «Пуск». На этот раз не будет никаких исключений.
На этом заканчивается статья о потреблении и сохранении состояния OData в Windows Phone.