C# WPF清空文本框时OnPropertyChange未触发问题求助
问题描述
清空WPF文本框时,其绑定的AdditionalSurfaceTreatmentInfo属性未触发OnPropertyChanged更新,但验证规则StandardValidationRule能正常检测到空值并发出警告。其他功能均正常,需实现清空文本框时触发属性更新,保证后续执行保存命令时可验证该属性。
相关代码片段
1. XAML代码
<TextBox Style="{StaticResource TextBoxErrorStyle}" Margin="8 0 0 0" Visibility="{Binding AdditionalSurfaceTreatmentInfoVisibility, Converter={StaticResource BoolToVisConverter}}" FontSize="12" MaxLength="4" Width="40" Height="25"> <TextBox.Text> <Binding Path="AdditionalSurfaceTreatmentInfo" UpdateSourceTrigger="PropertyChanged" NotifyOnSourceUpdated="True" Mode="TwoWay" NotifyOnValidationError="True"> <Binding.ValidationRules> <classes:StandardValidationRule ValidatesOnTargetUpdated="True"/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox>
2. 验证规则代码
public class StandardValidationRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { var valueToValidate = value as string; if (string.IsNullOrEmpty(valueToValidate)) { return new ValidationResult(false, "Field is mandatory."); } return new ValidationResult(true, null); } }
3. 绑定属性代码
private string _additionalSurfaceTreatmentInfo; public string AdditionalSurfaceTreatmentInfo { get => _additionalSurfaceTreatmentInfo; set { _additionalSurfaceTreatmentInfo = value; OnPropertyChanged(); SetOrModifySurfaceTreatment(); Console.WriteLine(string.IsNullOrEmpty(_additionalSurfaceTreatmentInfo).ToString()); } }
解决方案
原因分析
WPF默认会将完全清空的TextBox值转换为null传递给绑定源。若属性当前值已经是null,设置新值为null时,属性setter不会触发(因为值未发生变化),进而不会调用OnPropertyChanged。但验证规则直接作用于TextBox的目标值(空字符串),因此能检测到空值。
解决方法1:修改属性setter逻辑
调整setter,强制处理空字符串与null的转换,并确保值变化时触发更新:
private string _additionalSurfaceTreatmentInfo; public string AdditionalSurfaceTreatmentInfo { get => _additionalSurfaceTreatmentInfo; set { // 统一将空字符串转为null,避免值判断遗漏 var newValue = string.IsNullOrEmpty(value) ? null : value; if (_additionalSurfaceTreatmentInfo != newValue) { _additionalSurfaceTreatmentInfo = newValue; OnPropertyChanged(); SetOrModifySurfaceTreatment(); Console.WriteLine(string.IsNullOrEmpty(_additionalSurfaceTreatmentInfo).ToString()); } } }
解决方法2:绑定中设置TargetNullValue
在XAML绑定里添加TargetNullValue="",让源值为null时TextBox显示空字符串,同时清空TextBox时会将空字符串传递给源,确保setter被触发:
<Binding Path="AdditionalSurfaceTreatmentInfo" UpdateSourceTrigger="PropertyChanged" NotifyOnSourceUpdated="True" Mode="TwoWay" NotifyOnValidationError="True" TargetNullValue="">
解决方法3:手动触发绑定源更新
给TextBox添加TextChanged事件,在事件中手动更新绑定源:
<TextBox Style="{StaticResource TextBoxErrorStyle}" ... TextChanged="TextBox_TextChanged">
后台代码实现:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { var textBox = sender as TextBox; textBox?.GetBindingExpression(TextBox.TextProperty)?.UpdateSource(); }
验证方式
任选一种方案修改后,清空TextBox时查看控制台输出的string.IsNullOrEmpty(_additionalSurfaceTreatmentInfo).ToString()是否为True,同时确认OnPropertyChanged被触发,即可保证保存命令执行时能正确验证该属性。
内容的提问来源于stack exchange,提问作者MarKamp
相关产品推荐
相关产品推荐

