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