Ответ
Data Binding в WPF — это мощный механизм, который устанавливает динамическую связь между свойствами UI-элементов (цель, Target) и свойствами объектов данных (источник, Source). При изменении источника UI автоматически обновляется, и наоборот (в зависимости от режима).
Ключевые компоненты:
- Источник (Source): Любой CLR-объект. Для автоматического оповещения об изменениях свойств источник должен реализовывать интерфейс
INotifyPropertyChanged(INPC). - Цель (Target): Свойство зависимости (DependencyProperty) элемента управления WPF (например,
TextBox.Text). - Объект Binding: Связывает Target и Source, определяя путь к свойству, режим и опции.
- Конвертер значений (IValueConverter): Позволяет трансформировать данные при передаче между Source и Target (например, bool -> Visibility).
Базовый пример с INPC:
<!-- XAML: Привязка TextBox к свойству UserName -->
<TextBox Text="{Binding Path=UserName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
// C#: Класс-источник данных
public class UserViewModel : INotifyPropertyChanged
{
private string _userName;
public string UserName
{
get { return _userName; }
set
{
if (_userName != value)
{
_userName = value;
// КРИТИЧНО: Уведомляем систему привязки об изменении свойства
OnPropertyChanged(nameof(UserName));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
// Установка DataContext (источника) для окна или элемента
public MainWindow()
{
InitializeComponent();
this.DataContext = new UserViewModel();
}
Режимы привязки (Binding Mode):
OneWay: Обновление Target при изменении Source (по умолчанию для большинства свойств только для чтения).TwoWay: Обновление в обе стороны. Используется для редактируемых полей (TextBox, CheckBox).OneTime: Привязка происходит один раз при инициализации, дальнейшие изменения игнорируются.OneWayToSource: ОбратныйOneWay— обновляет Source при изменении Target.
Важные особенности:
- Отслеживание изменений в коллекциях: Для автоматического обновления UI при добавлении/удалении элементов в коллекции (например, в
ListBox) используйтеObservableCollection<T>. - Валидация: Через интерфейс
IDataErrorInfoили правила валидации в привязке (<Binding.ValidationRules>). - Отладка: Установите свойство
PresentationTraceSources.TraceLevelв привязке для диагностики проблем в Output окне.
Эта система декларативной привязки отделяет логику представления от данных, что является основой паттерна MVVM в WPF.