2012-05-07 3 views
0

У меня есть двусторонняя привязка к свойству строковой зависимости к тексту TextBox.Передача TwoWay на самом деле не двухсторонняя?

связывания выглядит следующим образом:

Text="{Binding MyValue, Mode=TwoWay}" 

У меня есть некоторый код, который срабатывает в OnKeyUp (в качестве вложенного свойства), который устанавливает MyValue. Но вместо того, чтобы принимать мою ценность и применять ее к свойству Text, это происходит наоборот.

Вот последовательность событий:

  1. Пользователь вводит строку текста, который выглядит следующим образом: 0299900650
  2. Пользователь нажимает ввод.
  3. В моем ключевом ключе я установил MyValue на 2999 и переместился в фокус на следующее поле.
  4. Сетчатка для MyValue срабатывает и делает NotifiyPropertyChanged с 2999
  5. LostFocus стреляет.
  6. инкубаторе для MyValue пожаров и делает NotifiyPropertyChanged с 0299900650.

Мне кажется, что моя ценность не делает его обратно в «TextBox.Text» каким-то образом. Когда я теряю фокус, TextBox обновляет значение строки с тем, что у нее есть в свойстве Text (неизмененное значение, потому что мое изменение не возвратилось.)

Есть ли какая-то волшебство WPF, о котором я не знаю?

ПРИМЕЧАНИЕ: Я дважды проверил свои привязки. (Кроме того, они работают с пользовательским интерфейсом, поэтому я думаю, что они верны для UI.)

ПРИМЕЧАНИЕ II: Когда я говорю, что «пользователь вводит строку», это действительно отсканированный штрих-код. Но поскольку я использую клавиатурный клин, это похоже на то, что он был введен. (Тем не менее, весь смысл установки значения заключается в том, что я делаю что-то другое, если пользователь сканирует его так же, как и при вводе текста.)

UPDATE: Я обнаружил, что это произошло из-за другого свойства, имеющего побочный эффект. Я смог решить проблему.

ответ

2

Вы просто прыгаете в конфликт конфликта на WPF связывая обмен сообщениями. Чтобы доказать, что, сделайте следующее:

  • удалить OnKeyUp даже обработчик

и сделать то же самое вы сделали. В Enter механизм привязки кликов запускает и устанавливает свой код за свойством.

В случае, если вы делаете на KeyUp, новое значение 2999 сжимается привязкой после.

Для правильного управления этим используйте Converter и избавитесь от OnKeyDown даже подписки.

+0

Есть ли способ сделать это, не подавляя OnKeyDown? У меня есть другие свойства, которые заинтересованы в этом событии. – Vaccano

+0

@ Ваккано: не то, что я знаю. Фактически существует событие [PreviewKeyDown] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx), но оно запускается ** перед ** привязкой, поэтому Кстати, привязка будет сжимать его, потому что он работает и на «LostFocus». Imo, лучшим решением является использование преобразователей и управление вашими переменными состояния внутри вашего кода. – Tigran

1

Вы пробовали прочитать эту статью? http://msdn.microsoft.com/en-us/library/ms754356.aspx

+0

Это отличная статья для другой стороны этой проблемы (переход от пользовательского интерфейса к собственности). Я пытаюсь получить обновление, чтобы перейти от свойства к пользовательскому интерфейсу. (Хотя я действительно пытался вызвать 'BindingExpression.UpdateSource();' просто, чтобы быть уверенным.) – Vaccano

0

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