Как выполнить двустороннее связывание данных в WPF? - PullRequest
12 голосов
/ 02 февраля 2010

Я много слышал о двусторонних привязках в WPF, но я не совсем понимаю, как это сделать или что это на самом деле означает.

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

Но когда пользователь изменяет текст в текстовом поле, я хочу ListView Элемент, который будет обновлен сразу же.Есть ли какой-нибудь волшебный способ "двустороннего связывания" WPF для достижения этой цели?

Ответы [ 3 ]

34 голосов
/ 02 февраля 2010

Ответ Марка показывает, как выполнить то, что вы хотите, но вы также задали более общий вопрос о том, «как выполнить [двустороннее связывание] и что это на самом деле означает».

Односторонняя привязка означает, что цель привязки (например, элемент управления) будет отображать данные из источника привязки (например, бизнес-объект) и будет обновляться при изменении бизнес-объекта, но эти изменения в элементе управления не будут распространяться обратно. к бизнес-объекту. Например. если Person.Name изменится с «bob» на «kate», привязанный к имени TextBlock.Text также изменится с «bob» на «kate».

Двусторонняя привязка просто означает, что не только изменения в бизнес-объекте отражаются в пользовательском интерфейсе, но и изменения, внесенные пользователем в пользовательском интерфейсе, распространяются и на бизнес-объект. Так что теперь, когда пользователь редактирует TextBox.Text, связанный с именем, скажем, изменив «kate» на «edmund», WPF также установит для свойства Person.Name значение «edmund».

Для этого просто установите Mode = TwoWay в объявлении Binding. Некоторые свойства связываются по умолчанию в двух направлениях: например, TextBox.Text связывает TwoWay по умолчанию, поэтому код Марка не нуждается в объявлении Mode. Кроме того, как отмечает Марк, по умолчанию WPF передает изменения обратно в бизнес-объект только тогда, когда элемент управления теряет фокус. Если у вас есть два элемента пользовательского интерфейса, связанные с одним и тем же свойством, это может означать, что они выглядят не синхронизированными, и в этом случае вы можете использовать UpdateSourceTrigger, чтобы заставить WPF распространяться при каждом изменении свойства.

MSDN подробно описывает это с помощью нескольких четких диаграмм: см. Обзор привязки данных в WPF SDK.

11 голосов
/ 02 февраля 2010

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

Кроме того, когда вы говорите, что хотите, чтобы элемент ListBox был немедленно обновлен, вы имеете в виду, что вы хотите, чтобы он изменился при вводе TextBox. По умолчанию свойство TextBox.Text обновляет свой источник, когда оно теряет фокус, но вы можете изменить это, установив привязку UpdateSourceTrigger к PropertyChanged:

{Binding Source={...}, Path=Whatever, UpdateSourceTrigger=PropertyChanged}
1 голос
/ 02 февраля 2010

Что такое тип элементов в ListView? Чтобы получить двустороннюю привязку, необходимо реализовать INotifyPropertyChanged ...

Это может помочь Изменено свойство события WPF?

...