StringFormat“N2”问题(?

时间:2016-09-23 18:47:08

标签: c# wpf

我有一个有点好奇的问题。我正在使用“StringFormat = N2”。当我有值“1,00”时,我将光标放在“,”后面按“退格”,数字变为,神奇地在“100,00”。 WTF!我需要保持“1,00” 它几乎总是发生在“100,00”=“10.000,00”等等

<TextBox Height="40" VerticalContentAlignment="Center" Width="320">
    <TextBox.Text>
        <Binding Path="Weight"
                 StringFormat="N2"
                 ConverterCulture="es-AR"
                 UpdateSourceTrigger="PropertyChanged">
        </Binding>
    </TextBox.Text>
</TextBox>

2 个答案:

答案 0 :(得分:2)

两个观察结果:

  1. StringFormat = N2告诉UI文本框中的值应格式化为带有两位小数的数字。

  2. 在ConverterCultuer = es-AR中告诉UI小数点字符是逗号。

  3. 让我们一步一步走:

    1. 值为1(显示为1,00)
    2. 删除逗号,但保留零
    3. 现在值为100(显示为100,00)
    4. 我没有看到问题。

答案 1 :(得分:0)

我认为问题在于这个属性:

UpdateSourceTrigger="PropertyChanged"

这会强制WPF每次TextBox的内容发生变化时都将值发送回视图模型,例如因为已在其中输入字符或从中删除了字符。

假设您的TextBox包含文字1,00,其中包含double1.0的视图模型。然后删除逗号,因此文本框中包含文本100。由于文本已更改,因此强制WPF从视图更新视图模型。字符串100成为double100.0,它在视图模型的Weight属性中设置。

如果您的视图模型类实现INotifyPropertyChanged(我假设它),它将为PropertyChanged属性触发Weight事件。 WPF侦听此事件,然后从TextBox属性更新Weight的内容。因此,您的TextBox包含文字100,00,因为这是使用100.0格式字符串格式化值N2的结果。

最简单的解决方法是删除属性UpdateSourceTrigger="PropertyChanged"。这会导致WPF仅在TextBox失去焦点时更新视图模型。您正在处理数字输入,很可能中间值无效或可能被误解,因此最好等到用户输入数值后才尝试对其进行任何操作。