Я услышал много о двухсторонней привязке в WPF, но я не совсем ясен о том, как выполнить его или что это на самом деле означает.
У меня есть a ListView
с набором объектов в нем. Когда пользователь выбирает новый объект, a TextBox
в приложении изменит его текст для отображения некоторого свойства выбранного пункта.
Но когда пользователь изменяет текст в текстовом поле, я хочу ListView
объект, который будет обновлен сразу также. Есть ли какой-либо "двухсторонний обязательный" волшебный способ WPF выполнить это?
Если у вас нет, вам нужно реализовать INotifyPropertyChanged
для вашего класса, к которому вы привязываетесь.
Кроме того, когда вы говорите, что хотите, чтобы элемент ListBox
обновлялся немедленно, вы имеете в виду, что хотите, чтобы он изменялся при вводе текста в TextBox
. По умолчанию свойство TextBox.Text
обновляет свой источник при потере фокуса, но вы можете изменить это, установив привязку UpdateSourceTrigger
на PropertyChanged
:
{Binding Source={...}, Path=Whatever, UpdateSourceTrigger=PropertyChanged}
Каков тип элементов в ListView? Чтобы получить двустороннюю привязку, необходимо реализовать INotifyPropertyChanged ...
Это может помочь изменить свойство события WPF?
Ответ Марка показывает, как выполнить то, что вы хотите, но вы также спросили в более общем плане о том, «как выполнить [двустороннюю привязку] и что на самом деле это означает. "
Односторонняя привязка означает, что цель привязки (например, элемент управления) будет отображать данные из источника привязки (например, бизнес-объекта) и будет обновлять себя по мере изменения бизнес-объекта, но это изменяется в элементе управления не будет распространяться обратно на бизнес-объект. Например. если Person.Name изменится с «bob» на «kate», TextBlock.Text, привязанный к Name, также изменится с «bob» на «kate».
Двусторонняя привязка просто означает, что не только изменения бизнес-объекта отражаются в пользовательском интерфейсе, но и изменения, сделанные пользователем в пользовательском интерфейсе, также распространяются обратно на бизнес-объект. Итак, теперь, когда пользователь редактирует TextBox.Текст, привязанный к имени, скажем, при изменении «kate» на «edmund», WPF также установит для свойства Person.Name значение «edmund».
Для этого просто установите Mode = TwoWay в объявлении привязки. Некоторые свойства по умолчанию связываются двусторонне: например, TextBox.Text по умолчанию связывает TwoWay, поэтому для кода Марка не требуется объявление Mode. Кроме того, как отмечает Марк, по умолчанию WPF передает изменения обратно в бизнес-объект только тогда, когда элемент управления теряет фокус. Если у вас есть два элемента пользовательского интерфейса, привязанных к одному и тому же свойству, это может означать, что они не синхронизированы, и в этом случае вы можете использовать UpdateSourceTrigger, чтобы заставить WPF распространяться при изменении свойства.
MSDN подробно описывает это с помощью нескольких хороших четких диаграмм: см. Обзор привязки данных в WPF SDK.