Сводные данные и изолированное хранилище в Silverlight - Синтаксический анализ потоков

ОГЛАВЛЕНИЕ

Синтаксический анализ потоков

При выполнении метода ReBindAggregatedItems данные веб-канала сохраняются в коллекции экземпляров SyndicatedFeed и соответствующих коллекциях экземпляров SyndicatedItem. LINQ – идеальный способ запроса данных веб-канала, поскольку на этом этапе веб-канал представляет собой объектную структуру. Данные было не обязательно загружать в объекты SyndicatedFeed. Вместо этого их можно было бы оставить в изначальном формате XML (RSS или AtomPub) и проанализировать при помощи XmlReader или LINQ to XML. Тем не менее, класс SyndicatedFeed позволяет достичь простоты в управлении, а LINQ можно использовать для запроса данных.

Отображение объектов веб-канала для нескольких веб-каналов требует, чтобы объекты веб-канала все были вместе. Запрос LINQ, показанный на рис. 4, показывает способ извлечения всх объектов (SyndicationItem instances) для всех веб-каналов (экземпляров SyndicationFeed) и сортировки их по дате публикации.

Рис. 4. Запрос веб-каналов при помощи LINQ

private void ReBindAggregatedItems()
{
  //Read the feed items and bind them to the lower list
  var query = from f in _feeds
  from i in f.Items
  orderby i.PublishDate descending
  select new SyndicationItemExtra
  { FeedTitle = f.Title.Text, Item = i };

  var items = query.ToList();
  feedItemsGridLayout.DataContext = items;
}

Обратите внимание на то, что на рис. 4 запрос возвращает список классов SyndicationItemExtra. Класс SyndicationItemExtra – это специализированный класс, обладающий свойством FeedTitle строкового типа и свойством Item типа SyndicationItem. Приложение отображает объекты в сетке данных DataGrid, при этом большинство данных для отображения находятся в классе SyndicationItem.

Однако поскольку приложение перемешивает объекты из разных полей, отображение заголовка для каждого объекта веб-канала позволяет точно определить, какому веб-каналу принадлежит каждый объект. Заголовок веб-канала недоступен из класса SyndicationItem, поэтому приложение использует особый класс SyndicationItemExtra, в котором будут помещены SyndicationItem и заголовок веб-канала.

Объекты веб-канала после этого в приложении Silverlight привязываются к объекту панели Grid – feedItemsGridLayout. Панель сетки Grid содержит сетку данных DataGrid, а также другие элементы интерфейса (например, количество отображаемых элементов в текстовом блоке TextBlock), которые участвуют в операциях привязки данных, чтобы отобразить сведения об объектах веб-канала.