当文本输入的强制转换导致源值不变时,使用UpdateSourceTrigger=PropertyChanged的TextBox上的文本不会更新。

13
我有一个文本框,其
1个回答

11

我在互联网上进行了一些搜索,结果发现这个问题出现在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;
    }
}

2
谢谢,这解决了我的问题。给未来的读者一个快速提示:由于我在TextBox上使用了常规绑定,所以我不得不将'MultiBindingExpression'用法更改为'BindingExpression'。 - Jumbala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接