Привязка состоит из двух сущностей:
- Источник (как правило, ViewModel в сценариях MVVM)
- Цель (элемент управления UI)
Цель должна быть DependencyObject
(для привязки к работе), а источник может быть либо DependencyObject
, либо у него должен быть какой-то механизм для имитации системы привязки WPF об ее изменении (реализация интерфейса INotifyPropetyChnaged
). ).
MVVM рекомендует, чтобы проект ViewModel был свободен от любых ссылок, связанных с View, и, следовательно, рекомендуется использовать интерфейс INotifyPropertyChanged
, чтобы объект Source был услышан связыванием WPF.
Связывание происходит между свойством Source и свойством Target (должно быть DependencyProperty
).
например TextProperty
класса TextBox
- это DataBound для (скажем) UserName
свойства модели представления.
WPF переплет предлагает четыре типа переплета. Помните, что связывание выполняется в потоке пользовательского интерфейса, если не указано иное, чтобы оно выполнялось иначе.
- OneWay : целевое свойство будет прослушивать изменяемое свойство источника и обновится само. Если вы программно измените свойство ViewwModel
UserName
, оно отобразится в текстовом поле. Это промежуточная стоимость, поскольку система привязки отслеживает только изменения Source .
- TwoWay : целевое свойство будет прослушивать измененное исходное свойство и обновится само. И Свойство источника будет прослушивать изменяемое целевое свойство и обновится само. И свойство
TextProperty
, и свойство UserName
останутся синхронизированными и обновят друг друга, если они будут изменены. Это наиболее затратно, поскольку система переплета должна следить за изменениями с обеих сторон.
- OneWayToSource : свойство Source изменится при изменении свойства target. Если пользователь изменяет
TextProperty
, свойство UserName
примет измененное значение. Это опять-таки имеет промежуточную стоимость, поскольку система привязки отслеживает только изменения Target .
- OneTime : это происходит только один раз за время существования привязки, свойство Target будет обновлено со свойством Source , когда произойдет привязка. Это наименее затратно и рекомендуется для сценариев, в которых у вас есть статические данные для отображения, например
Label
, TextBlock
и т. Д.
Если вы ничего не упоминаете, каждое свойство target имеет режим привязки по умолчанию, связанный с самим собой. Например. TextProperty
из TextBox
имеет режим связывания по умолчанию как TwoWay
. Для TextProperty
из TextBlock
это один из способов.
Желательно, чтобы вы выбрали правильный режим, поскольку он может помочь вам снизить задержку приложения, особенно в тех случаях, когда в вашем пользовательском интерфейсе имеется большое количество элементов управления.
Подробнее о MVVM здесь - статья, написанная мной.