Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Wpf-АК11.doc
Скачиваний:
6
Добавлен:
01.03.2025
Размер:
3 Мб
Скачать
☆

Теоретически сведения

1. Концепция привязки данных

На самом деле идея привязки данных не нова (нов способ их реализации в WPF), с некоторых пор привязки уже используются в ASP.NET и Winforms. Платформа WPF заимствовала лучшее из обеих платформ, что позволило создать действительно хорошую систему привязки данных.

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

Вот типичная схема привязки (рис. 7.1):

Рис.7.1 - Типичная схема привязки

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

Целевое свойство должно быть свойством зависимости (см. Лабораторная работа 6). Большинство свойств элементов интерфейса являются свойствами зависимости, и большинство свойств зависимости, за исключением доступных только для чтения, по умолчанию поддерживает привязку данных.

2. Свойство DataContext

Прежде чем переходить к подробному изучению привязок данных, следует сказать о свойстве DataContext, присущем каждому элементу FrameworkElement. Свойство DataContext позволяет элементам наследовать от своих родительских элементов информацию об источнике данных привязки, а также другие параметры привязки, например путь. Свойству DataContext можно присвоить непосредственно объект CLR с привязками для вычисления свойств такого объекта. Либо можно присвоить контекст данных объекту DataSourceProvider.

Это свойство зависимости наследует значения свойства. Если есть дочерние элементы, у которых свойству DataContext не присвоено значение с помощью локальных значений или стилей, система свойств присваивает ему значение свойства DataContext ближайшего родительского элемента с таким значением.

В XAML свойство DataContext обычно задается в объявлении Binding. Можно использовать синтаксис элемента свойства или синтаксис атрибута. Обычно это делается так.

<Window.Resources>

 <src:LeagueList x:Key="MyList" />

...

...

</Window.Resources>

...

...

<DockPanel DataContext="{Binding Source={StaticResource MyList}}">

Задать свойство DataContext можно и в коде, используя выражения следующего вида: <элемент>.DataContext = <значение>.

Стоит рассмотреть ситуацию, когда для некоторого объекта, наследующего свойство DataContextродительского объекта, не указаны поля, которые будут использоваться для привязки, например:

<MenuItem Tag="{Binding}">

Это значит, что весь объект, использующий свойство DataContext родительского объекта, будет присвоен свойству Tag.

3. Основные понятия привязки данных

Прежде чем переходить к рассмотрению привязки данных, необходимо остановиться на нескольких важных моментах:

  • направление потока данных;

  • что инициирует обновление источника.

Направление потока данных. При использовании привязки данных можно настроить несколько режимов. Управление режимами происходит с помощью значений Binding.Mode.

  • Привязка OneWay автоматически обновляет целевое свойство при изменении исходного, но изменения целевого свойства не передаются обратно исходному. Этот тип привязки оптимален, если связываемый элемент управления неявно доступен только для чтения.

  • Привязка TwoWay автоматически обновляет целевое свойство при изменении исходного и наоборот. Этот тип привязки подходит для редактируемых форм или других полностью интерактивных сценариев пользовательского интерфейса.

  • Привязка OneTime обеспечивает инициализацию целевого свойства значением исходного, но последующие изменения не передаются. Это означает, что изменение контекста данных или объекта в контексте данных не отражается в целевом свойстве. Такой тип привязки подходит для данных, в которых применяется снимок текущего состояния, или для действительно статических данных.

  • Привязка OneWayToSource противоположна привязке OneWay. Она обновляет исходное свойство при изменении целевого.

  • С привязкой Default целевое свойство по умолчанию использует значение Mode.

Для задания направления потока данных используется свойство Binding.Mode. Чтобы обнаруживать изменения исходного свойства в односторонних и двусторонних привязках, в источнике должен быть реализован подходящий механизм уведомления об изменении свойств, например интерфейс INotifyPropertyChanged.

Уведомление об изменении — не менее важная тема, так что давайте рассмотрим ее прямо сейчас. Посмотрим на пример использования интерфейса INotifyPropertyChanged.

Для автоматического отражения динамических изменений источника привязки в ее целевых свойствах OneWay или TwoWay в классе должен быть механизм уведомления об изменениях свойства. Для этого используется интерфейс INotifyPropertyChanged.

using System.ComponentModel;

namespace SDKSample

{

 // Этот класс реализует интерфейс INotifyPropertyChanged

 // для поддержки привязок one-way и two-way

 // (в которых элемент управления обновляется при динамическом изменении

 // источника)

 public class Person : INotifyPropertyChanged

 {

     private string name;

     // Объявлениесобытия

     public event PropertyChangedEventHandler PropertyChanged;

     public Person()

     {

     }

     public Person(string value)

     {

         this.name = value;

     }

     public string PersonName

     {

         get { return name; }

         set

         {

             name = value;

             // Вызов OnPropertyChanged приобновлениисвойства

             OnPropertyChanged("PersonName");

         }

     }

     // Создание метода OnPropertyChanged для порождения события

     protected void OnPropertyChanged(string name)

     {

         PropertyChangedEventHandler handler = PropertyChanged;

         if (handler != null)

         {

             handler(this, new PropertyChangedEventArgs(name));

         }

     }

 }

}

Чтобыреализоватьинтерфейс INotifyPropertyChanged, нужнообъявитьсобытие PropertyChanged исоздатьметодOnPropertyChanged. А затем для каждого свойства, требующего уведомления об изменении, вызывать метод OnPropertyChanged при каждом обновлении свойства.

Поверьте, интерфейс INotifyPropertyChanged критически важен, изучите его как следует. Особенно если вы планируете использовать привязки в приложениях WPF.

Что инициирует обновление источника. Привязки типа TwoWay и OneWayToSource прослушивают изменения целевого свойства и передают их в исходное. Это называется обновлением источника. Например, может потребоваться, чтобы изменение текста в элементе TextBox приводило к изменению базового исходного значения. Как говорилось в предыдущем разделе, направление потока данных определяется значением свойства Binding.Mode привязки.

Свойство Binding.UpdateSourceTrigger привязки определяет, что инициирует обновление источника. Возможны следующие варианты.

В следующей таблице приведены примеры сценариев для каждого значения Binding.UpdateSourceTrigger. Для примера используется элемент TextBox.

Значение UpdateSourceTrigger

Когда обновляется исходное значение

LostFocus (значение по умолчанию для TextBox.Text)

При потере фокуса элементом TextBox

PropertyChanged

При вводе в элементе TextBox

Explicit

При вызове приложением метода UpdateSource

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]