Как выполнить двустороннюю привязку данных в WPF?

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

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

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

Ответ 1

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

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

{Binding Source={...}, Path=Whatever, UpdateSourceTrigger=PropertyChanged}

Ответ 2

Отметить ответ показывает, как выполнить то, что вы хотите, но вы также более подробно просили "как выполнить [двустороннюю привязку] и то, что она на самом деле означает."

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

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

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

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

Ответ 3

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

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