Привязка к двойному с помощью StringFormat на TextBox - PullRequest
6 голосов
/ 18 ноября 2011

Я использую TextBox WPF с привязкой свойства Text к двойному значению в моей ViewModel.

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

<TextBox Text="{Binding Path=MyDoubleValue, StringFormat=N2, UpdateSourceTrigger=PropertyChanged}" />

К сожалению, когда я переключаю UpdateSourceTrigger на PropertyChangedи введите значение 12345, я получу 12,354.00 ( РЕДАКТИРОВАТЬ : обратите внимание на 5 перед 4).Это результат сохранения курсора в том же месте после добавления , между 2 и 3 форматером .NET.

Как я могу использовать StringFormat с UpdateSourceTrigger, установленным в PropertyChanged?

Примечание. Это происходит только в .NET 4.

1 Ответ

8 голосов
/ 18 ноября 2011

Обычно вы не хотите, чтобы UpdateSourceTrigger было PropertyChanged для привязки TextBox.Text, потому что это вызывает уведомление о проверке и изменении при каждом нажатии клавиши.

Если вы делаете это толькотак что, если пользователь нажмет Enter, он сохранит значение перед обработкой команды сохранения, а затем я бы предложил подключить событие PreviewKeyDown и обновить источник вручную, если нажата клавиша Enter (обычно я делаю это AttachedProperty)

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        var obj = sender as UIElement;
        BindingExpression textBinding = BindingOperations.GetBindingExpression(
            obj, TextBox.TextProperty);

        if (textBinding != null)
            textBinding.UpdateSource();
    }
}

Но с учетом вышесказанного, если вы все еще хотите использовать UpdateSourceTrigger=PropertyChanged, рассмотрите возможность использования форматирования при отображении значения, но удалите его, пока пользователь его редактирует.

<TextBox>
    <TextBox.Style>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Text" Value="{Binding Path=MyDoubleValue, StringFormat=N2}" />
            <Style.Triggers>
                <Trigger Property="IsFocused" Value="True">
                    <Setter Property="Text" Value="{Binding Path=MyDoubleValue, UpdateSourceTrigger=PropertyChanged}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>
...