Привязка данных к элементам управления - WPF

Привязка данных к элементам управления - WPF

Для обеспечения связки объекта данных и элементов формы. Нужно задать у общего родителя элементов свойство DataContext использовав как параметр объект данных, это позволит связать поля данного объекта со свойствами интересующих элементов по средствам выражения:

пример:
- объект данных
   class DataEntity {
        private int numberField = 50;
        public int NumberField
        {
            get { return numberField; }
            set { numberField = value; }
        }
    }

- разметка
<Slider Value="{Binding Path=NumberField, TargetNullValue=0}" Width="200" Height="20" Maximum="100"/>

Задав параметр TargetNullValue можно указать какое значение будет установлено в случае значения поля null.

Для обеспечения возможности оповещения привязанных элементов о изменении полей объект с данными должен реализовать интерфейс System.ComponentModel.INotifyPropertyChanged - это будет единственное событие которое собственно и надо вызвать при изменении передав в параметре экземпляр PropertyChangedEventArgs с именем измененного свойства в параметре конструктора.

пример:
- объект данных
   class DataEntity: INotifyPropertyChanged {
        private int numberField = 50;
        public int NumberField
        {
            get { return numberField; }
            set {
                numberField = value;
                PropertyChanged(this, new PropertyChangedEventArgs("NumberField"));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

привязка коллекций

WPF позволяет привязать коллекции к элементам, это делается по средствам установки свойства ItemsSource. Использоваться для этого могут любые коллекции и массивы. По умолчанию для отображения элемента списка используется строка возвращаемая методом toString(), возможно выбрать для отображения некоторое поле или свойство указав его наименование в свойстве DisplayMemberPath.

пример:
- установка коллекции
List<LinksListItem> searchLinks = new List<LinksListItem>();
SeachLinksList.ItemsSource = searchLinks;

- разметка
<ListBox x:Name="SeachLinksList" DisplayMemberPath="LinkTitle" />

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

пример:
- привязка контекста данных
<Grid DataContext="{Binding ElementName=SeachLinksList, Path=SelectedItem}">
- привязка элемента ввода к полю выбранного объекта
<TextBox Grid.Row="1" x:Name="TestTextBox" Text="{Binding Path=LinkTitle}" />

при выборе элемента списка будет производиться динамическое изменение текста в поле TestTextBox, так же может быть настроено направление изменения данных(автоматическое изменение значения поля объекта при изменении текста в TestTextBox).

Также можно обработать событие возникающее при выборе элемента в списке "SelectionChanged". В обработчике текущий элемент можно получить через свойство SelectedItem вызвавшего событие элемента.

пример:
LinksListItem LinkItem = ((ListBox)e.Source).SelectedItem as LinksListItem;

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

пример:
ICollection<LinksListItem> searchLinks;
searchLinks = new System.Collections.ObjectModel.ObservableCollection<LinksListItem>();
SeachLinksList.ItemsSource = searchLinks;
В таком варианте список на форме будет отображать всегда актуальное состояние коллекции searchLinks.


Возврат к списку