Ранее было отмечено, что привязка способна автоматически обновлять целевое свойство при изменении источника данных. Чтобы реализовать этот функционал, можно поступить одним из следующих способов:
1. Сделать свойство источника данных свойством зависимостей.
2. Генерировать при изменении источника событие Имя-СвойстваChanged.
3. Реализовать в источнике интерфейс INotifyPropertyChanged (пространство имён System.ComponentModel), содержащий событие PropertyChanged. Это событие нужно генерировать при изменении данных, указывая имя свойства.
Проведём модификацию класса Person, используя третий подход:
public class Person: INotifyPropertyChanged
{
private string _name;
private double _age;
public string Name
{
get { return _name; }
set { SetProperty(ref _name, value, "Name"); }
}
public double Age
{
get { return _age; }
set { SetProperty(ref _age, value, "Age"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void SetProperty<T>(ref T field, T value, string name)
{
if (!EqualityComparer<T>.Default.Equals(field, value))
{
field = value;
var handler = PropertyChanged;
if (handler!= null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
}
Для того чтобы изменения в целевом свойстве попадали в источник данных, нужно установить режим привязки в BindingMode.TwoWay или BindingMode.OneWayToSource. При необходимости можно также задать свойство привязки UpdateSourceTrigger – момент обновления источника данных. Если UpdateSourceTrigger установить в UpdateSourceTrigger.Explicit, требуется написать код, вызывающий для обновления метод UpdateSource() у объекта BindingExpression, связанного с элементом:
|
|
// tbxAge – это поле ввода, привязанное к свойству возраста
BindingExpression be =
tbxAge.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();