Работа с DataGrid в Silverlight 2
Междоменный сетевой доступ
Приложения Silverlight 2 также могут вызывать "исходный" сервер при осуществлении сетевых вызовов (то есть, они могут вызывать ссылки ресурсов (URL) в том же домене, с которого было загружено приложение) тогда, когда удаленный веб-сервер имеет файл XML-правил, который указывает на то, что клиентам разрешено делать данные междоменные вызовы.
Silverlight 2 определяет формат файла XML-правил таким образом, что это позволяет администраторам сервера строго контролировать тип доступа клиента. Silverlight 2 также принимает стандартный формат файла междоменной политики Flash - то есть вы можете использовать Silverlight 2 для того, чтобы вызвать любые существующие удаленные конечные сервисы REST, SOAP/WS*, RSS, JSON и XML по сети с уже предоставленным междоменным доступом для Flash-клиентов.
Digg.com обладает неплохим набором Digg API интерфейсов, которые они распрастраняют при помощи HTTP. Поскольку они имеют междоменную политику Flash на своем сервере, мы можем вызывать их напрямую из нашего клиентского приложения Silverlight Digg (и нет необходимости возвращаться через наш сервер для достижения их интерфейса прикладной программы).
Digg.com Topic Feed API
Мы хотим разрешить пользователям приложения вводить тему поиска (к примеру, "Программирование" ("Programming")) и затем нажать кнопку поиска ( "Search") для получения самых хитовых статей с сайта Digg.com, которые совпадают с поисковым критерием:
Для выполнения этого мы можем использовать список статей Digg.com REST API feed API . Он принимает параметр темы в своей ссылке на ресурс (URL: к примеру: GET /stories/topic/programming), и затем возвращает XML-набор статей с сайта Digg.com, которые совпали с темой поиска.
Использование System.Net.WebClient для выполнения асинхронного вызова Digg REST Feed
После нажатия кнопки поиска SearchButton нам придется обработать ее событие "Click", получить строку поиска из элемента управления TextBox, и затем начать сетевой вызов к Digg.com для того, чтобы получить XML-список, относящийся к запрашиваемой теме..
Silverlight включает в себя класс помощник WebClient в пространстве имен System.Net (также в полной версии .NET Framework). Мы можем использовать данный класс для асинхронной загрузки содержимого по указателю ресурса (URL). Преимущество асинхронной загрузки статей с сайта Digg.com заключается в том, что пользовательский интерфейс не заблокирует и не повиснет в ожидании на удаленном сервере.
Все что нам надо сделать для выполнения асинхронной загрузки при помощи класса WebClient, так это зарегистрировать метод "DownloadStringCompleted" обработчика события , который будет вызван как только запрашиваемое содержимое будет загружено, и затем вызвать WebClient.DownloadStringAsync(url) метод-помощник для инициализации загрузки:
Написав данный код мы можем асинхронно получить строку XML-данных, которая содержит статьи по запрашиваемой пользователем тематике.
Использование LINQ to XML для разбора (парсинга) XML-текста с Digg.com в классы Story
Теперь, когда мы можем получить фрагмент XML-кода данных с сайта Digg, следующим шагом будет разбор и преобразование его в объекты "DiggStory", которыми мы впоследствии можем манипулировать и привязать к нашим.
Мы реализуем это, объявив класс "DiggStory", обладающий свойствами, которые сопоставляют XML-содержимое с сайта Digg (мы используем новую возможность в C#, называемую "автоматические свойства"):
Затем, мы можем использовать LINQ (который встроен в Silverlight 2) и LINQ to XML (являющуюся библиотекой, которую мы можем включить в наше приложение Silverlight) для простого разбора и фильтрации документа XML , который мы получили с сайта Digg, и преобразовать его в последовательность объектов "DiggStory" при помощи следующего кода:
Обратите внимание на то, что объекты DiggStory сильно типизированы из нашего XML.
Отображение информации, полученной с Digg, в элементе управления DataGrid
Мы будет использовать элемент управления DataGrid для того, чтобы отобразить информацию с сайта Digg в нашем приложении. Для реализации этого нам понадобится сослаться на сборку элементов управления Data в Silverlight, и затем заменить наш предыдущий текст "Todo" на странице декларацией элемента DataGrid (заметка: вы можете дважды щелкнуть по элементу управления "datagrid" и инструментария для того, чтобы автоматически добавить его на страницу):
DataGrid позволяет явно настроить объявление колонок и отображать типы (для полноты управления). В качестве альтернативы, если вы не укажете это все, элемент DataGrid будет ссылаться на источник данных для того, чтобы создать колонки по умолчанию, основываясь на схеме ваших объектов.
Затем мы обновим класс с фоновым кодом для того, чтобы программно привязать свойство "ItemSource" элемента DataGrid к последовательности статей, которую мы получили с сайта Digg после нажатия кнопки поиска:
И теперь, при запуске приложения Silverlight и выполнения поиска, мы увидим список статей , полученных с сайта Digg:
Datagrid поддерживает все стандартные возможности элемента управления Grid клиентской стороны: двустороннее замещающее редактирование, выборку, прокрутку, изменение размера колонки, изменение порядка колонок и т.д. Он также поддерживает изменения размера содежимого страницы для того, чтобы правильно и полностью заполнить контейнер, в котором оно находится. DataGrid также имеет богатую модель шаблона, которая позволяет вам настроить как отображение, так и редактирование данных.
Следующие шаги
Теперь мы можем получать данные с сайта Digg.com и отображать их в приложении.
Нашим следующим шагом будет возврат к разметке нашей страницы Page.xaml и удаление встроенной декларации стилей, которая используется в данный момент.