为什么我的 WPF 转换器“错过”了 TextBox 中的最后一个字符?

Why does my WPF converter “miss” the last character in the TextBox?

我正在使用 Visual Studio 2019 构建一个 WPF 应用程序。此应用程序的一个视图内部有一个 TextBox,它绑定到它的 属性 DataContext。与 TextBox 相关的代码是这样的:

<TextBox x:Name="Alpha" Text="{Binding Model.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, 
                              ValidatesOnDataErrors=True, Converter={StaticResource ToUpper}}" />

如您所料,ToUpper 转换器将 TextBox 中的文本转为大写。当我在 TextBox 中写一些东西时,我看到它是大写的,所以转换器似乎可以工作。到目前为止一切顺利,但问题是最后一个字符在转换过程中似乎“丢失”了。我这么说是因为当我在 TextBox 中写一些东西时,在视图的代码隐藏中,转换器将文本变成大写:

private void OnLoaded(object sender, RoutedEventArgs e)
   Alpha.KeyDown += Alpha_KeyDown;
}

private void Alpha_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) {
   if (e.Key == Key.Return) {
      var a = Alpha.text;
   }
}

我发现 a 变量存储与 TextBox 完全相同的文本,但最后一个字符小写。例如,如果我在 TextBox 中写“abcde”,转换器将其变为大写并且视图呈现“ABCDE”,但 a 设置为“ABCDe”。

转换器的Convert()方法是这样的:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
   var myString = value as string;
   return text != null ? text.ToUpper() : "No text";
}

为什么会这样?

您的转换器在通过文本框文本和视图模型之间的绑定机制传输时更改值 属性。

说清楚。

输入时不会更改值。

您正在使用 keydown 事件直接从文本框中抓取数据:

private void FiscalCodeEb_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
 {
   if (e.Key == Key.Return) {
       var a = Alpha.text;
    }
}

未转换。

改用视图模型中的值 属性。

KeyDown 事件在文本 属性 更改之前触发。下面可以说清楚:

private void Alpha_KeyDown(object sender, KeyEventArgs e)
{
 if (e.Key == Key.Return)
 {
  Debug.WriteLine("After return: " + Alpha.Text);
 }
 else
 {
  Debug.WriteLine(Alpha.Text + e.Key.ToString().ToUpper());
 }
}

因此,此时 Alpha.Text 尚未使用新密钥进行更新,因此未进行转换。