Подтвердить что ты не робот

Каковы различные режимы привязки WPF?

Я не понимаю различные режимы привязки данных в WPF, например:

  • Односторонняя
  • двухсторонняя
  • Одноразовый
  • и т.д...

Что означает каждый из этих режимов?

Когда они должны использоваться?

4b9b3361

Ответ 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 здесь - это статья, написанная мной.