【问题标题】:strange Problem with WPF Textbox stringformat - Cursor moves backWPF文本框字符串格式的奇怪问题 - 光标向后移动
【发布时间】:2010-05-17 19:26:18
【问题描述】:

我正在使用 WPF 4.0 TextBox 和绑定。我正在使用 StringFormat 将数字格式化为货币。 XAML 看起来像这样:

<TextBox Text="{Binding Path=ValueProperty, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, StringFormat={}{0:C}, UpdateSourceTrigger=PropertyChanged}">
</TextBox>

除了奇怪的行为外,一切似乎都正常工作: 例如,当用户输入 12 时:在输入 1 之后,文本框中的值变为 $1.00,奇怪的是光标移动到了 $ 和 1 之间。 因此,当用户简单地输入 12 时,结果变为 21.00 美元。

如何解决这种奇怪的行为?

【问题讨论】:

    标签: wpf data-binding


    【解决方案1】:

    我会将您的 UpdateSourceTrigger 改回 LostFocus 的默认值(用于 TextBox)。

    通过将其设置为 PropertyChanged,您将强制验证和字符串格式在用户每次键入字符时运行。这会导致非常奇怪的行为,例如您所看到的。

    如果您将其保留为默认值(或将其显式设置回 LostFocus),格式化 + 验证将在用户完全键入时发生。这将消除 StringFormat 插入新字符、验证中途中断以及您在使用 PropertyChanged 时遇到的其他问题时发生的奇怪问题。

    【讨论】:

    • 那么当你有一个 IsDefault 设置为 true 的按钮并且你输入一个值然后按 Enter 时会发生什么。通常不会推送该值,您将丢失刚刚输入的值。
    【解决方案2】:

    你可以使用这个字符串格式来解决这个问题

    "$###\,##0.0##"
    

    你的代码应该是这样的

    <TextBox Text="{Binding Path=ValueProperty, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, StringFormat=$###\,##0.0##, UpdateSourceTrigger=PropertyChanged}">
    </TextBox>
    

    【讨论】:

      【解决方案3】:

      此问题已在 .NET 4.5 中得到修复。对于 .NET 4,我必须删除 StringFormat 才能保留 UpdateSourceTrigger=PropertyChanged

      【讨论】:

      • 我们在使用 .NET 4.5.2 时仍然遇到这个问题,即使使用 .NET 4.6.1 进行了测试...。运气不好!
      猜你喜欢
      • 2015-09-21
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 2017-10-27
      • 1970-01-01
      • 2022-11-19
      相关资源
      最近更新 更多