Какие существуют режимы привязки WPF?

86

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

  • Одностороннее движение
  • Двусторонний
  • Один раз
  • так далее...

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

Когда их следует использовать?

ДАТТ ОЗА
источник

Ответы:

159
  • OneWay: Используйте это, если вы хотите, чтобы привязанное свойство обновляло пользовательский интерфейс.
  • TwoWay: Имеет такое же поведение, как OneWayи в OneWayToSourceсочетании. Связанное свойство обновит пользовательский интерфейс, а изменения в пользовательском интерфейсе обновят привязанное свойство (например, вы можете использовать это с a TextBoxили a Checkbox).
  • OneTime: Имеет такое же поведение, OneWayза исключением того, что пользовательский интерфейс обновляется только один раз. Это должно быть вашим выбором по умолчанию для привязки (по разным причинам я не буду здесь подробно останавливаться), вам следует использовать другие типы привязок, только если вам действительно нужны дополнительные функции.
  • OneWayToSource: Это противоположно OneWay- изменение значения пользовательского интерфейса обновляет привязанное свойство.

Если вы ничего не укажете, поведение будет зависеть от элемента управления, который вы используете.

Для получения дополнительной информации см. BindingModeEnum в MSDN .

Дэйв
источник
Спасибо. это полезно ... Но, пожалуйста, укажите пример TwoWay ... я хочу знать, как он отражает код программной части.
DATT OZA
2
@DATT: что вы имеете в виду под словом «указать»? По сути, если вы установите Mode = TwoWay в XAML, когда вы измените значение GUI, оно автоматически обновит свойство C #. Но ваше свойство в коде программной части должно быть реализовано в классе (например, ViewModel), который реализует интерфейс INotifyPropertyChanged. Когда код программной части изменяет значение свойства с помощью set, вам необходимо вызвать PropertyChanged, чтобы графический интерфейс был уведомлен об изменении значения и обновлялся автоматически.
Дэйв
1
Если вы ничего не укажете, поведение будет зависеть от СВОЙСТВА, который вы используете.
Mauro Sampietro
37

Привязка состоит из двух сущностей:

  1. Источник (обычно ViewModel в сценариях MVVM)
  2. Цель (элемент управления пользовательского интерфейса)

Цель должна быть DependencyObject(для работы привязки), а источником может быть либо a, DependencyObjectлибо у нее должен быть какой-то механизм для имитации системы привязки WPF при ее изменении (реализация INotifyPropetyChnagedинтерфейса).


MVVM рекомендует, чтобы проект ViewModel был свободен от любых ссылок, связанных с представлением, и, следовательно, рекомендуется использовать INotifyPropertyChangedинтерфейс, чтобы объект Source был слышен привязкой WPF. Связывание происходит между свойством Source и свойством Target (должно быть DependencyProperty). например, TextPropertyиз TextBoxкласса DataBound в (скажем) UserNameсвойство модели представления. Привязка WPF предлагает четыре типа привязки. Помните, что привязка выполняется в потоке пользовательского интерфейса, если вы не укажете иное, чтобы она выполнялась иначе.

  1. OneWay : целевое свойство будет прослушивать изменение исходного свойства и обновлять себя. Если вы программно измените UserNameсвойство ViewwModel , оно отобразится в текстовом поле. Это имеет промежуточную стоимость, поскольку система привязки отслеживает изменения только Источника .
  2. TwoWay : целевое свойство будет прослушивать изменение исходного свойства и обновляться. И свойство источника будет прослушивать изменение целевого свойства и обновлять себя. И свойство, TextPropertyи UserNameсвойство будут синхронизироваться и будут обновлять друг друга при изменении. Это наиболее затратно, так как система крепления должна следить за изменениями с обеих сторон.
  3. OneWayToSource : свойство Source изменится при изменении целевого свойства. Если пользователь изменит TextProperty, UserNameсвойство примет измененное значение. Это опять же имеет промежуточную стоимость, поскольку система привязки отслеживает изменения только Target .
  4. OneTime : это происходит только один раз за время существования привязки, свойство Target будет обновлено свойством Source, когда произойдет привязка. Это наименее затратно и рекомендуется для сценариев, когда у вас есть статические данные для отображения, например Label, TextBlockи т. Д.

Если вы ничего не упомянули, каждое целевое свойство имеет связанный с ним режим привязки по умолчанию. Например, для TextPropertyобъекта по TextBoxумолчанию используется режим привязки как TwoWay. Для TextPropertyсемьи TextBlockэто один путь.

Желательно, чтобы вы выбрали правильный режим, поскольку он может помочь вам уменьшить задержку приложения, особенно в тех случаях, когда у вас есть большое количество элементов управления в вашем пользовательском интерфейсе.

Подробнее о MVVM можно прочитать в статье, написанной мной.

Джеймс
источник