2013-12-20 1 views
2

Я привязываю источник данных к текстовому блоку Windows Forms, и источник должен проверять каждое нажатие клавиши, чтобы обеспечить своевременную обратную связь с пользователем (в виде связанных элементов управления, являющихся включено выключено). Поэтому я привязываюсь к DataSourceUpdateMode :: OnPropertyChanged. К сожалению, это приводит к тому, что текстовое поле сбрасывает курсор влево от поля с каждым нажатием клавиши, в результате чего пользовательский ввод отменяется. Использование DataSourceUpdateMode :: OnValidation устраняет проблему с курсором, но тогда, конечно, источник данных не обновляется до тех пор, пока фокус не покинет TextBox, и это неприемлемо в этом случае (у меня есть кнопка «Применить», которая является серым до тех пор, пока значение не изменится).C++/CLR DataSourceUpdateMode :: OnPropertyChanged с TextBox перемещает курсор влево

This thread описывает проблему, но только для RichTextBox и утверждает, что проблема не существует для обычного TextBox. У меня проблема с регулярным TextBox.

Кто-нибудь видел эту проблему и нашел способ обойти ее и по-прежнему использовать объект Binding?

EDIT: Тестирование показало, что Нажмите событие для кнопки на форме пожаров до того проверки, а это означает, что если пользователь щелкает в текстовом поле, чтобы изменить значение, затем щелкает непосредственно на «Применить» введенный значение не распространяется на источник данных вовремя, чтобы реагировать на щелчок. Другими словами, полезность OnValidate с текстовым полем значительно снижается для моего приложения.

+0

То, что вы называете «неприемлемым», абсолютно нормально. Вы не хотите обновлять источник данных, пока пользователь все еще не работает в текстовом поле. –

+1

Ханс, я специально хочу обновить источник данных, пока пользователь все еще ходит в текстовом поле. В этом весь смысл. –

ответ

1

Включает форматирование строки для привязки, фиксирует проблему положения каретки.

Что было:

textbox->DataBindings->Add("Text", model_object, "MyProperty", false, 
    DataSourceUpdateMode::OnPropertyChanged); 

становится:

textbox->DataBindings->Add("Text", model_object, "MyProperty", true, 
    DataSourceUpdateMode::OnPropertyChanged); 

и, как по волшебству, каретка останавливается репозиционирование себя. Если кто-нибудь может прокомментировать и объяснить, почему это имеет смысл, пожалуйста, сделайте это!

This MSDN forum post прислал подсказку, чтобы попробовать включить форматирование строк.

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