Как выполнить двустороннюю привязку данных в 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?