这很难解释,所以请看下面的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;
}
}
如果有更好的方法来处理这些事情,请告诉我。
现在,我如何处理第二个问题?我试图实现的变通方法是--如果到达小数点,处理按键并移动小数点的位置。不知道这是否是一个好的解决方案,如果是的话,如何知道我什么时候到达小数点?
将小数点指数与文本框值的长度进行比较,就为了知道是否到了小数点,似乎有些过分。这2个问题的正确解决方法是什么?
问题是由于当stringformat被应用到值时。
也就是当值从绑定的Source(绑定的字符串属性)返回到TextBox Text(目标)的时候。
而且它与textpropety的元数据相连。
Textbox TextProperty绑定的是双路,这是在该依赖属性的元数据中设置的。
文本框的默认行为是当控件失去焦点时将值复制到绑定的源。
如果你使用这种方式,那么一旦用户完成编辑,就会应用n2格式。他们可以随心所欲地修改零点和小数点,只有当他们离开标签时,格式才会被应用。
相反,如果你在绑定中设置UpdateSourceTrigger="PropertyChanged",那么你会发现它的行为很奇怪。这是因为用户键入一个字母后,整个值会被转移到绑定的属性中,而属性会通知控件它发生了变化.在应用格式化时,各种奇怪的坏事都会发生。
这有可能是构建文本框的人没有考虑到的边缘情况。