【问题标题】:WPF TextBox reacting weirdly with stringformat 0:N2WPF TextBox 对 stringformat 0:N2 做出奇怪的反应
【发布时间】:2020-05-13 10:28:49
【问题描述】:

这很难解释,所以请看下面的 WPF gif -

我有一个字符串格式为 {0:N2} 并绑定到属性的文本框。

这里有两个问题-

(1) 按下小数键时,会添加另一个小数。

(2) 在退格期间,删除小数位后 - 插入符号不会跳过小数位,而是开始将“00”添加到数字本身。

我针对第 (1) 点做了一个解决方法 -

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Decimal)
    {
        e.Handled = true;
        ((TextBox)sender).CaretIndex += 1;
    }
}

如果在应用程序中有更好的方法来处理此类事情 - 请告诉我。

现在,我该如何处理第二个问题?我尝试实施的解决方法是 - 如果达到小数点,则处理按键并移动插入符号的位置。不确定这是否是一个好的解决方案,如果是,如何知道我何时到达小数点?

将插入符号索引与文本框值的长度进行比较只是为了知道它是否已到达小数点似乎有点过头了。这两个问题的正确解决方案是什么?

【问题讨论】:

  • 我猜你的绑定中有 UpdateSourceTrigger="PropertyChanged" 。如果您删除它,文本框的行为是否更像您想要的那样?
  • 哇哦!是的,删除它,确实使它正常运行。将 sourcetrigger 更改为 lostfocus,因为它仍然为我提供了我需要的行为。为什么'PropertyChanged' 让它表现得像那样?另外,如果您可以将其作为答案发布,我将接受它作为解决方案。

标签: c# wpf textbox string-formatting


【解决方案1】:

问题是由于 stringformat 应用于 value 的时间。

这是从绑定 Source(绑定的字符串属性)返回到 TextBox Text(Target)的值。

它链接到 textpropety 的元数据。

Textbox TextProperty 双向绑定,这是在该依赖属性的元数据中设置的。

文本框的默认行为是在控件失去焦点时将值复制到绑定源。

如果你使用它,那么一旦用户完成编辑,就会应用 n2 格式。他们可以用零和小数点来修改他们喜欢的任何东西,并且只有在他们离开时才会应用这种格式。

相比之下,如果您在绑定中设置 UpdateSourceTrigger="PropertyChanged",那么您会发现它的行为很奇怪。这是因为用户键入了一个字母,整个值被传送到通知控件它改变的绑定属性。 在应用格式时会发生各种奇怪的坏事。

这可能是构建文本框的人没有考虑到的边缘情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 2015-12-31
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多