Различные UpdateSourceTriggers для способов привязки
Я не знаю, как мне реализовать одно специальное поведение. У меня есть представление с сеткой данных, которая включает в себя две колонки. В одном столбце отображается форматированная цена ("00,00"). Цена будет автоматически сохранена, когда привязка будет обновлена (свойство установлено). Если я использую UpdateSourceTrigger=PropertyChanged, цена всегда будет правильной. Недостаток этого триггера заключается в том, что если пользователь выделит весь текст в текстовом поле и введет просто "1", цена будет отформатирована до "01.00". Я не хочу, чтобы цена автоматически формировалась. Это форматирование должно появляться только тогда, когда фокус перемещается на другой объект.
Теоретически мне нужно установить два разных UpdateSourceTrigger. Один для обновления бэкэнда (пользователь вводит что-то в текстовое поле). И один для обновления цели (фокус переместился на другой объект). Кроме того, мне нужно немедленно отобразить, если новое значение является недействительным.
<DataGrid>
<DataGrid.Columns>
<!-- one other column -->
<DataGridTemplateColumn Header="Price"/>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<!-- this textbox should update the source if user types something -->
<!-- the textbox itself should be updated after lost focus -->
<TextBox Text="{Binding Price, UpdateSourceTriger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn/>
</DataGrid.Column>
</DataGrid>
РЕДАКТИРОВАТЬ: Я приведу небольшой пример: если я установлю привязанное свойство Price в "1", оно автоматически будет преобразовано в "01.00". С UpdateSourceTrigger = PropertyChanged TextBox отображает "01.00". Я хочу, чтобы TextBox отображал "1", пока TextBox сфокусирован. Конечно, я получу такое поведение с UpdateSourceTrigger=LostFocus. Проблема здесь в том, что DataGrid содержится в TabControll, и оба элемента управления не очень хорошо работают вместе. Если вы выберете другую вкладку, когда фокус все еще находится на TextBox, TextBox не выбросит LostFocus.
Надеюсь, у некоторых из вас есть для меня совет:-)
Андре
1 ответ
Вы всегда можете использовать UpdateSourceTrigger=LostFocus
чтобы запустить форматирование ваших чисел, когда пользователь удаляет фокус из TextBox. Для проверки я бы порекомендовал использовать проверку в формате презентации Windows, который встроен в элементы управления пользователя.
Изменить: добавить событие OnSelect к TabItem
установить Фокус (удаляет фокус из TextBlock), но IsInabled и IsFocusable должны быть включены в TabItem.