Технологии Microsoft для создания RIA-приложений

Отображение данных в Silverlight

Показывать лекцию целиком

Data Binding

Привязка данных (Data Binding) обеспечивает простой способ представления данных и взаимодействия с ними в приложениях на основе Silverlight. Способ отображения данных отделен от управления данными. Подключение или привязка между пользовательским интерфейсом и объектом данных позволяет данным передаваться между ними. Если установлена привязка, а данные изменяются, элементы пользовательского интерфейса, которые привязаны к данным, могут отражать изменения автоматически. Аналогично изменения, сделанные пользователем в элементе пользовательского интерфейса, отображаются в объекте данных. Например, если пользователь изменяет значение в элементе TextBox, базовое значение данных автоматически обновляется, чтобы отразить это изменение.

Пример привязки данных:

public class WebDeveloper
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Website { get; set; }
}
<TextBlock x:Name="nameTextBlock" Text="{Binding FirstName} Mode=OneWay"/>

Значения атрибута XAML

Варианты использования XAML- атрибута:

  • <object property="{Binding}"/>
  • <object property="{Binding propertyPath}"/>
  • <object property="{Binding oneOrMoreBindingProperties}"/>
  • <object property="{Binding propertyPath, oneOrMoreBindingProperties}"/>
  • Расширенная разметка XAML
    СинтаксисОписание
    propertyPath Строка, указывающая путь к свойству для привязки.
    oneOrMoreBindingProperties Одно или несколько свойств привязки, заданных с помощью синтаксиса пары имя-значение.
    bindingPropertyName Имя строки свойства Binding, которое требуется задать. Некоторые свойства могут задаваться только с помощью расширений разметки с более глубоким вложением.
    value Значение, задаваемое для свойства. Обработка значения атрибута, в конечном счете, уникальна для типа и логики задаваемого свойства bindingPropertyName.

    Расширение разметки Binding использует синтаксис bindingPropertyName=значение, поскольку существует несколько свойств чтения-записи объекта Binding, который можно задать. Свойства могут задаваться в любом порядке и разделяются запятыми.

    В таблице 26.2приводятся свойства привязки, которые можно задать с расширением разметки привязки.

    Свойства класса System.Windows.Data.Binding
    ИмяТип данныхОписания
    Path Задает путь к свойству источника привязки. Как отмечалось в предыдущем разделе "Пути к свойствам", можно задать Path через строку сразу после начальной части расширения разметки Binding (например, {Binding Employee.FirstName} ), или также можно явно указать путь, как и другие свойства с именем Binding (например, {Binding Path=Employee.FirstName} ).
    Converter IValueConverter Указывает объект преобразователя, вызываемый модулем привязки. Преобразователь можно задать в XAML, но только если имеется в виду преобразователь, который определен в таким образом, что его можно создать и поместить в ResourceDictionary в XAML.
    ConverterCulture CultureInfo Задает язык и региональные параметры, используемые преобразователем. Преобразователь языка и региональных параметров можно задать как идентификатор, основанный на стандартах.
    ConverterParameter Object Задает параметр преобразователя, который можно использовать в логике преобразователя. Большинство конвертеров используют простую логику, которая может принимать строковое значение ConverterParameter. Написание конвертера, который использует объекты, не являющиеся строками, и передача объектов ConverterParameter в XAML являются сложными сценариями, которые здесь не рассматриваются.
    Mode BindingMode Задает режим привязки как одну из следующих строк:

    OneTime (одноразовая) привязка устанавливает приемник и после этого привязка завершается. Это отлично подходит для отображения информации, которая изменяется очень редко, либо вообще никогда.

    OneWay (односторонняя) привязка устанавливает приемник и обновляет его по ходу изменения источника. Это отлично подходит для отображения информации, которую пользователю не разрешено изменять.

    TwoWay (двусторонняя) привязка устанавливает приемник и обновляет его по мере изменения источника, а также изменяет источник, в том случае если пользователь изменит приемник либо что-то другое в приложении, что может вызвать изменение источника

    Source Object Задает источник данных объекта. В расширении разметки Binding свойству Source требуется ссылка на объект, например ссылка StaticResource. Если это свойство не задано, действующий контекст данных задает источник.
    NotifyOnValidationError Bool Включает режим проверки или уведомления в привязке. Может принимать значение true или false (значение по умолчанию — false ).
    ValidatesOnExceptions Bool Включает режим проверки или уведомления в привязке. Может принимать значение true или false (значение по умолчанию — false ).
    ValidatesOnNotifyDataErrors Bool Включает режим проверки или уведомления в привязке. Может принимать значение true или false (значение по умолчанию — true ).
    ElementName String Задает источник данных, ссылаясь на другой элемент, имеющий свойство Name или Атрибут x:Name (значение атрибута ElementName задает это имя). Элемент должен существовать в одном пространстве имен XAML.
    RelativeSource RelativeSource Задает источник данных путем описания расположения источника привязки относительно положения цели привязки. Это выражается в терминах графа объектов во время выполнения и может быть Self или TemplatedParent. Независимо от того, задается ли в форме атрибута или как свойство привязки в расширении разметки, задание свойства RelativeSource в XAML требует использования RelativeSource - расширение разметки.
    UpdateSourceTrigger UpdateSourceTrigger Задает время обновлений источника привязки как одну из следующих строк: Default или Explicit. Если данный элемент не задан, по умолчанию используется значение Default.

    Проверка данных

    Silverlight поддерживает проверку простых данных в привязках TwoWay для обновлений от цели к источнику. Кроме того Silverlight 4 поддерживает проверку с IDataErrorInfo и INotifyDataErrorInfo независимо от режима привязки.

    Silverlight сообщает ошибку проверки, если вложенное свойство Validation..::..Errors привязки содержит ошибки. Ошибки добавляются к данной коллекции в следующих случаях:

  • Исключения создаются из преобразователя типов механизма привязки.
  • Исключения создаются из метода доступа set объекта привязки.
  • Исключения создаются из атрибута проверки, который применяется к объекту данных или члену.
  • Объект привязи реализует IDataErrorInfo и его свойство Item возвращает значение, не являющееся null или Empty.
  • Объект привязи реализует INotifyDataErrorInfo и его метод GetErrors возвращает значение, не являющееся null. Возвращаемое GetErrors значение может изменяться в результате выполнения завершения асинхронных операций проверки.
  • Silverlight предоставляет визуальную обратную связь для ошибок проверки в следующих случаях:

  • Значение свойства ValidatesOnExceptions равно true.
  • Значение свойства ValidatesOnDataErrors равно true. Однако свойство ValidatesOnDataErrors игнорируется для исходного свойства, если значение свойства ValidatesOnExceptions равно true и установочный метод исходного свойства выдает исключение.
  • Значение свойства ValidatesOnNotifyDataErrors равно true. Это свойство может, работаь в сочетании с ValidatesOnExceptions и ValidatesOnDataErrors.
  • Визуальная обратная связь указывает, что элемент управления содержит ошибку и отображает сообщение об ошибке, как показано на рис. 26.1.

    (рис 26.1) Валидация в Silverlight

    Визуальную обратную связь для элемента управления можно настроить путем изменения или замены его ControlTemplate по умолчанию.

    Для получения уведомлений, что произошла ошибка проверки или она была разрешена, необходимо установить для свойства NotifyOnValidationError значение true для объекта привязки. Это сообщает подсистеме привязки команд о необходимости вызова обытия BindingValidationError при добавлении или удалении из коллекции Validation..::..Errors ошибки проверки. Например можно обработать событие ошибки, чтобы записать ошибку в журнал или предоставить дополнительную визуальную обратную связь.

    Для обработки события BindingValidationError, создайте обработчик событий на целевой объект или на любом из его родителей. Событие BindingValidationError является маршрутизируемым событием, поэтому если вы не обрабатываете его на элементе, вызвавшем событие, оно будет продолжать возникать до тех пор, пока не будет обработано.

    Привязка создается в XAML:

    <StackPanel BindingValidationError="StackPanel_BindingValidationError" >
        <StackPanel.Resources>
            <my:Bills x:Name="MyBills"/>
        </StackPanel.Resources>
        <TextBox x:Name="MyTextBox" Width="50" Margin="10">
            <TextBox.Text>
                <Binding Mode="TwoWay" Source="{StaticResource MyBills}" 
                         Path="Amount" NotifyOnValidationError="true" 
                         ValidatesOnExceptions="true"/>
            </TextBox.Text>
        </TextBox>
        <Button Height="50" Width="150" Content="Click To Update Source"/>
    </StackPanel>

    Исходный объект создает исключение в установленном методе доступа, если значение является отрицательным:

    public class Bills
    {
        private double _Amount;
        public double Amount
        {
            get { return _Amount; }
            set
            {
                if (value < 0)
                    throw new Exception("Сумма должна быть больше нуля.");
                _Amount = value;
            }
        }
    
    }

    StackPanel реализует обработчик события BindingValidationError:

    private void StackPanel_BindingValidationError(object sender, 
        ValidationErrorEventArgs e)
    {
        if (e.Action == ValidationErrorEventAction.Added)
        {
            MyTextBox.Background = new SolidColorBrush(Colors.Red);
    
        }
        else if (e.Action == ValidationErrorEventAction.Removed)
        {
            MyTextBox.Background = new SolidColorBrush(Colors.White);
        }
    }

    WCF Data Services

    Службы WCF Data Services (которые раньше назывались "ADO.NET Data Services") — это компонент платформы .NET Framework, с помощью которого можно создавать службы, использующие протокол Open Data Protocol (OData) для передачи и получения данных через Интернет или интрасеть с помощью семантики REST. Службы OData предоставляют данные в качестве ресурсов, доступ к которым осуществляется с помощью URI.Доступ и изменение данных производится с помощью таких стандартных команд HTTP, как GET, PUT, POST и DELETE. В службах OData используются соглашения связи сущностей модели Entity Data Model для предоставления ресурсов в виде наборов сущностей, связанных с помощью сопоставлений.

    При адресации и обновлении ресурсов службы Службы WCF Data Services используют протокол OData . В результате доступ к этим службам можно получить из любого клиента, который поддерживает OData . С помощью OData запросы и запись данных в ресурсы осуществляются с использованием традиционных форматов передачи: нотации объектов JavaScript (JSON), текстового формата обмена данными, интенсивно применяемого в приложении AJAX, и Atom — набора стандартов обмена данными и их обновления на основе XML.

    Службы WCF Data Services позволяют предоставлять данные, поступающие из различных источников, в виде каналов OData. Средства Visual Studio упрощают создание служб на базе OData за счет использования модели данных ADO.NET Entity Framework. Также можно создавать каналы OData, основанные на классах CLR, данных с поздним связыванием или данных, не имеющих типа.

    В состав служб Службы WCF Data Services также включен набор клиентских библиотек: одна для типовых клиентских приложений .NET Framework, а другая специально для приложений на основе Silverlight. Эти клиентские библиотеки предоставляют возможности объектно ориентированного программирования для доступа к каналу OData из таких платформ, как .NET Framework и Silverlight.

    На рис 26.2показана архитектура служб Службы WCF Data Services для предоставления каналов OData, а также использование этих каналов в клиентских библиотеках, поддерживающих OData.

    (рис 26.2) Архитектура службы WCF Data Services

    Entity Data Model

    Модель Entity Data Model (модель EDM) — это спецификация для определения данных, используемых приложениями, построенными на основе платформы Entity Framework. Приложения используют определенные моделью EDM сущности и связи в домене приложения в схеме макета. Схема макета используется для создания программируемых классов, используемых кодом приложения. Структуры хранилища, материализующие данные для приложений в этой модели, представлены в другой схеме, называемой схемой хранилища. Спецификация сопоставления соединяет схему макета и схему хранилища.

    Поскольку программируемая модель объектов создается из схемы макета, а схема хранилища сопоставляется со схемой макета, спецификация сопоставления выполняет эффективное соединение программируемых классов со структурами хранилища. Сущности, определенные в модели EDM, могут быть считаны в сериализованной форме с помощью модуля чтения данных или материализованы как объекты. Материализованные объекты являются программируемыми в языках CLR. Их можно обновлять или сохранять без внедренных строк SQL или другого синтаксиса базы данных. Модель EDM предоставляет основные типы сущностей и связей, используемые в EDM-схемах и спецификации сопоставления. При необходимости разработчики могут расширить эти типы для поддержки макета приложения.

    Для управления данными в приложениях используется несколько важных принципов. Модель хранения оптимизирована для эффективного хранения и получения данных. XML поддерживает межплатформенный обмен данными. Объектно-ориентированное программирование является стандартом для разработки приложений. Все эти модели полезны, однако перенос данных между ними или из них может потребовать много строк кода, не имеющих никакого отношения к сценариям приложения.

    Модель данных может быть проанализирована с помощью языка UML или схем на доске. Необходимо выполнить концептуальную организацию типов данных, их атрибутов, связей между типами данных, ограничений данных и т. д. перед тем, как их будет можно реализовать в коде приложения. Модель EDM расширяет модели, используемые разработчиками данных для описания данных во время процесса разработки, и предоставляет XML-синтаксис для подробного описания результатов в схематичной форме.

    В практическом занятии № 25 продемонстрировано создание WCF Data Service и ADO .NET Entity Data Model

    Обработка XML - данных в Silverlight

    Обработка XML-данных с помощью LINQ to XML

    LINQ to XML — это располагаемый в памяти интерфейс программирования XML с поддержкой LINQ, позволяющий работать с XML из языков программирования платформы .NET Framework.

    LINQ to XML сходен с объектной моделью документов (DOM) в том, что он помещает XML-документ в память. Можно запросить и изменить документ, после чего сохранить его в файле или сериализовать его и передать через Интернет. Тем не менее, LINQ to XML отличается от модели DOM: он предоставляет новую объектную модель, более легковесную и простую в работе, в которой используются языковые усовершенствования Visual C# 2010.

    Наиболее важное преимущество интерфейса LINQ to XML заключается в его интеграции со встроенными в язык запросами (Language-Integrated Query, LINQ). Такая интеграция позволяет писать запросы к расположенному в памяти XML-документу для получения коллекций элементов и атрибутов. Возможности запросов LINQ to XML сравнимы в плане функциональности (но не в плане синтаксиса) с XPath и XQuery.

    Практическое руководство. Создание динамического XAML-кода с помощью LINQ to XML

    Обработка данных XML с помощью XmlReader и XmlWriter

    Классы XML в пространстве имен System.Xml позволяют работать с XML-данными и XML-документами. Эти классы поддерживают анализ, запись и редактирование XML-данных в памяти. Обратите внимание, что пространство имен System.Xml в .NET Framework для Silverlight представляет собой подмножество System.Xml в .NET Framework. Наиболее значительно то, что тип XmlDocument недоступен в Silverlight. Вместо этого следует использовать класс XmlReader для чтения XML-данных. Дополнительные сведения о других отличиях двух платформ см. в разделе Обработка XML в .NET Framework по сравнению с .NET Framework для Silverlight.

    Класс XmlReader обеспечивает доступ только для чтения к XML-данным без кэширования, допускающий перемещение только в прямом направлении. Этот класс поддерживает считывание XML-данных из потока, TextReader или файла в пакете XAP приложения. Определяет методы и свойства, которые позволяют перемещаться по XML-данным и считывать их содержимое. Для создания объекта XmlReader необходимо использовать метод Create.

    Класс XmlWriter предоставляет способ создания XML-потоков только для записи без кэширования, допускающий перемещение только в прямом направлении. Для создания объекта XmlWriter необходимо использовать метод Create. При использовании методов XmlWriter для вывода XML элементы и атрибуты не записываются полностью до тех пор, пока не будет вызван метод Close или Flush

    Практическое руководство. Разбор XML с помощью XmlReader

    Вернуться к учебному плану