我有一个文本框,其
我在互联网上进行了一些搜索,结果发现这个问题出现在WPF 4中。一个几乎相同的问题的人在这里发帖: http://www.go4answers.com/Example/textbox-shows-old-value-being-coerced-137799.aspx
"答案8"指出这个问题在WPF 4中出现,提出了解决方法, 即实际使用UpdateSourceTrigger =“Explicit”
, 但是要处理TextChanged事件并调用BindingExpression.UpdateSource()来强制文本框中的更改反映到底层值中,就像UpdateSourceTrigger =“PropertyChanged”
一样。 参考以下帖子:
Coerce a WPF TextBox not working anymore in .NET 4.0
我实施了这个方案,但意外地发现有进一步的副作用,特别是每输入一个字符就会导致插入符号跳到文本框的开头,因为更新源代码并引发PropertyChanged事件。此外,任何前导或尾随的零或小数点都将立即被删除,导致无法再输入更多的数字。 因此,对文本框中解析的十进制值与底层值进行简单的条件检查即可解决此问题。
以下事件处理程序是所需的全部内容:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
var tb = (TextBox)e.Source;
MultiBindingExpression binding = BindingOperations.GetMultiBindingExpression(tb, TextBox.TextProperty);
decimal result = 0m;
decimal.TryParse(tb.Text, out result);
if ((decimal)GetValue(ValueProperty) != result && binding != null)
{
int caretIndex = tb.CaretIndex;
binding.UpdateSource();
tb.CaretIndex = caretIndex;
}
}