WPF中Grid内TextBox未触发验证错误高亮问题排查
WPF Grid内TextBox未触发INotifyDataErrorInfo错误高亮的问题解决
我最近在开发一个基于.NET 4.7的WPF应用时遇到了个棘手的小问题:我写的UserControl里有个包含两个TextBox的Grid,XAML代码如下:
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBlock Grid.Column="0" Grid.Row="0" Text="Application ID" /> <TextBox Grid.Column="1" Grid.Row="0" Text="{Binding AzureAppID}"/> <TextBlock Grid.Column="0" Grid.Row="1" Text="Vault URL" /> <TextBox Grid.Column="1" Grid.Row="1" Text="{Binding AzureVaultUrl}" /> </Grid>
我已经通过INotifyDataErrorInfo接口实现了验证逻辑,比如要求AzureAppID不能为空。但当输入无效值时,奇怪的事情发生了:整个Grid会显示红色边框提示错误,可TextBox本身却完全没反应——不像我其他控件(比如DataGrid里的TextBox)那样会高亮标记错误。
折腾了好一阵才揪出问题根源:验证逻辑中标记错误的字段名称和绑定的属性名称存在细微差异,导致WPF引擎没法把错误和对应的TextBox匹配上。
举个实际的例子,可能我在验证逻辑里把字段写成了azureAppID(小写开头),但ViewModel里的属性是AzureAppID(大写开头);或是拼写时多打了一个字母、少了个下划线。WPF在匹配INotifyDataErrorInfo的错误时,是严格按照属性名称的字符串精准匹配的,哪怕只是大小写不同,都会导致错误无法关联到目标TextBox,反而让父容器Grid触发了错误提示。
解决起来很简单:只需要确保验证逻辑中传递的字段名称,和ViewModel里的绑定属性名称完全一致(包括大小写、拼写、符号),WPF就能正确把错误标记到对应的TextBox上了。
内容的提问来源于stack exchange,提问作者user4266661
相关产品推荐
相关产品推荐

