Опубликован: 15.06.2011 | Уровень: для всех | Доступ: платный
Лекция 13:

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

Аннотация: Отображение данных в Silverlight, WCF Data Services, Pocessing XML Data.

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}"/>
Таблица 26.1. Расширенная разметка XAML
Синтаксис Описание
propertyPath Строка, указывающая путь к свойству для привязки.
oneOrMoreBindingProperties Одно или несколько свойств привязки, заданных с помощью синтаксиса пары имя-значение.
bindingPropertyName Имя строки свойства Binding, которое требуется задать. Некоторые свойства могут задаваться только с помощью расширений разметки с более глубоким вложением.
value Значение, задаваемое для свойства. Обработка значения атрибута, в конечном счете, уникальна для типа и логики задаваемого свойства bindingPropertyName.

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

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

Таблица 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.

Валидация в Silverlight

Рис. 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);
    }
}
Андрей Ляхов
Андрей Ляхов
Казахстан, Талгар
Игорь Сикорский
Игорь Сикорский
Украина, Сумы