2010-02-01 14 views
11

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

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

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

ответ

11

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

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

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

В зависимости от того, как он настроен, этот источник может быть изменен на ElementName (с помощью пути SelectedItem.Whatever) или, если набор связанных элементов является DataContext, можно опустить, но в последнем случае для ListView потребуется IsSynchronizedWithCurrentItem = "True". – itowlson

+0

Это точно так же, как говорит Ивольсон. Большое спасибо! –

+0

Ahh true, и спасибо за исправление синтаксиса;) –

1

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

Это может помочь WPF event property changed?

+0

Элементы в представлении списка представляют собой объекты, которые реализуют 'INotifyPropertyChanged'. –

+0

У вас есть образец того, как выглядит ваш код? – anthonyv

33

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

Односторонняя привязка означает, что цель привязки (например, управление) будет отображать данные из источника привязки (например, бизнес-объект) и будет обновляться по мере изменения бизнес-объекта, но изменения в элементе управления не будут распространяться вернуться к бизнес-объекту. Например. если имя 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 подробно описывает это с некоторыми хорошими четкими диаграммами: см. Data Binding Overview в WPF SDK.

+1

Хороший обзор привязки. =) –

+0

Вверх проголосовали. Прошел тонну результатов поиска, в которых все описано, как реализовать двустороннюю привязку данных, но ни одна из них не объясняет концепцию. Ваш пост сделал и довольно лаконично. –

+0

Благодарим за это, особенно утверждение «Некоторые свойства связывают двухсторонний по умолчанию: TextBox.Text, например, связывает TwoWay по умолчанию» Это очень помогло :) – sergeantKK

Смежные вопросы