2015-02-26 2 views
0

У меня есть WPF TextBox, у которого есть текстовое значение, связанное в XAML. Это работает нормально и, как и ожидалось, когда связанное значение загружается в поле, оно отформатируется по желанию.Как я могу изменить (т. Е. Переключить) свойство bound, StringFormat элемента управления WPF?

Моя проблема заключается в том, когда пользователь вводит текстовое поле для изменения значения, я хочу отменить форматирование и отобразить исходное базовое значение.

Для этого я попытался установить свойство BindingExpression.ParentBinding.StringFormat, в текстовом поле привязки из-за события GotFocus. Однако, когда я попытался установить свойство StringFormat в пустую строку, я получил следующее исключение:

Binding не может быть изменен после того, как она была использована.

Таким образом, после того, как контроль был привязан к объекту модели данных, есть прямой способ, что я могу изменить формат строкового TextBox? Я хочу изменить способ форматирования значения элемента управления, но конечное желание состоит в том, чтобы разбить форматирование данных при его редактировании и повторно установить форматирование строки после выхода пользователя из поля.

+0

недавно я сделал подобный предмет. См. Ссылку. http://stackoverflow.com/questions/28643298/wpf-custom-textbox-with-decimal-formatting/28661951#28661951 –

+0

Lol, спасибо @Ganesh. Это именно то, что мне нужно. Если я не смогу найти способ сделать это без создания нового элемента управления, я воспользуюсь вашей реализацией (и дайте Райану ответный знак, так как это его предложение). Однако я мог бы найти способ сделать это с помощью стили и триггеры ... Мне нужно будет поэкспериментировать и обновить этот вопрос. – RLH

ответ

1

Я бы, вероятно, попробовал бы это по-другому. Похоже, вы используете тот же TextBox для форматированного значения и редактируете исходное значение. Было бы проще использовать два разных текстовых блока для просмотра и редактирования или упаковать их в UserControl. Кроме того, я бы использовал два свойства, например. RawText и FormattedText, а у UserControl будут свойства DependencyProperties с привязками к обоим свойствам. UserControl автоматически переключится на Edit TextBox. Однако вопрос о том, как работает автоматическое переключение, может быть проблемой. Вероятно, вам нужно использовать GotFocus для просмотра текстового поля, как вы упомянули, хотя, может быть, неплохо было бы иметь фактическую кнопку Edit, которая переключит ее для вас.

Я понимаю о переключении на WPF. При переключении на WPF существует довольно небольшая корректировка (ака обучения). Я бы подумал об этом как о разработке формы или контроля, который «подходит для цели». Однако вам не нужно создавать новый UserControl. Вы можете сделать что-то похожее на StackOverflow, где есть Edit TextBox, а затем область View, которая будет эквивалентна значениям Raw и Formatted. Вы должны контролировать видимость Редактирования TextBox через BoolToVisibilityConverter, когда находитесь в режиме редактирования. Создайте свойство public bool IsEditing на ViewModel и привяжите его к <EditTextBox Visibility="{Binding IsEditing, Converter={StaticResource BoolToVisibilityConverter}}" Text="{Binding RawText}" ...etc... />. После работы с WPF какое-то время вы действительно цените привязку данных, и это затрудняет возврат к обычным WinForms (по крайней мере для меня - не говоря уже о том, что нет проблемы!).

+0

Это может быть лучшим ответом, однако ... Я с трудом принимаю это, чтобы изменить формат значения, которое я должен переопределить элемент управления для такой простой задачи. PS: Это мой первый проект WPF, и я кодировал WinForms с .Net 1.0. Я * могу * действовать как испорченный brat: P – RLH

+0

Спасибо за обновление, но, к сожалению, я в корпоративной среде. У меня есть четко определенный проектный документ, и это явно указано и является довольно жестким требованием пользователя. Такова жизнь. – RLH

+0

Я понимаю о требованиях к документам. Тоже самое.Просто помните, что пересмотр плохого требования лучше, чем плохая реализация плохого требования. Если это требование является единственным элементом управления, я бы пошел с предложением UserControl и получим, что он работает. – Ryan

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