为啥我的 WPF 转换器“错过”文本框中的最后一个字符?

Posted

技术标签:

【中文标题】为啥我的 WPF 转换器“错过”文本框中的最后一个字符?【英文标题】:Why does my WPF converter “miss” the last character in the TextBox?为什么我的 WPF 转换器“错过”文本框中的最后一个字符? 【发布时间】:2021-01-12 11:10:15 【问题描述】:

我正在使用 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";

为什么会这样?

【问题讨论】:

【参考方案1】:

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

要清楚。

它不会在键入时更改值。

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

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

没有转换。

改用 viewmodel 属性中的值。

【讨论】:

【参考方案2】:

在 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 尚未使用新密钥进行更新,因此未进行转换。

【讨论】:

老实说,Alpha.Textif 中是大写的。 是的,只是在按下该特定键的过程中最后一个键字符不会出现。这就是为什么该键被显式附加到我的处理程序中的原因。 但是如果我按Enter,这不会是另一个按键吗? 是的。在这种情况下,Alpha.Text 应该按照以下条件写入完整的大写文本: if (e.Key == Key.Return) Debug.WriteLine("After return: " + Alpha.Text); @PineCode,如果有帮助,请将其标记为答案。

以上是关于为啥我的 WPF 转换器“错过”文本框中的最后一个字符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 tabcontrol 内的 WPF 文本框中单击时,Windows 10 键盘会出现并立即消失?

WPF文本框中的垂直对齐

如何在没有焦点的情况下突出显示/选择 wpf 文本框中的文本?

为啥我的验证事件没有在 C# 中触发?

为啥选择 RelayCommand

如何在 WPF 文本框中选择多个文本段?