WPF TextBox 对 stringformat 的反应很奇怪 0:N2

WPF TextBox reacting weirdly with stringformat 0:N2

这很难解释所以请看下面的 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;
    }
}

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

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

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

问题是在将字符串格式应用于值时引起的。

这是因为值从绑定源(绑定字符串 属性)返回到文本框文本(目标)。

并且链接到 textpropety 的元数据。

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

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

如果您使用它,则在用户完成编辑后应用 n2 格式。他们可以用零和小数点来修正他们喜欢的任何东西,并且只有当他们离开时才会应用格式。

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

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