WPF多个TextBox绑定同一TextChanged事件出现控件为null报错问题
问题原因
报错和多个文本框共用同一个事件处理方法无关,核心原因是XAML控件的初始化顺序和TextChanged事件的触发时机:
XAML中的控件按代码书写顺序依次完成初始化,你给文本框设置了默认Text="255",控件初始化时给Text属性赋值的操作会立刻触发TextChanged事件。此时排在红色文本框后面的绿色、蓝色文本框还没有完成初始化,自然是null值,访问就会抛出空引用异常。
修复方案
- 方案1:在事件处理方法开头加空值判断,只要任意关联控件未初始化完成就直接终止执行逻辑,同时修正原有代码的逻辑漏洞,示例如下:
private void UpdateColorPickerDisplay(object sender, TextChangedEventArgs e) { // 新增空值判断,所有控件初始化完成后再执行后续逻辑 if (ColorPickerDisplayRed == null || ColorPickerDisplayGreen == null || ColorPickerDisplayBlue == null || ColorPickerDisplay == null) return; // 修复原有TryParse后多余分号的问题,同时增加数值范围校验,避免转换byte时报错 if (int.TryParse(ColorPickerDisplayRed.Text, out int R) && int.TryParse(ColorPickerDisplayGreen.Text, out int G) && int.TryParse(ColorPickerDisplayBlue.Text, out int B) && R is >=0 and <=255 && G is >=0 and <=255 && B is >=0 and <=255) { var brush = new SolidColorBrush(Color.FromArgb(255, (byte)R, (byte)G, (byte)B)); ColorPickerDisplay.Background = brush; } }
- 方案2:不在XAML中绑定
TextChanged事件,等所在窗口/页面的Loaded事件触发后,再后台给三个文本框绑定事件,避开初始化阶段的触发。 - 方案3:删除XAML中文本框的默认
Text="255"配置,等窗口初始化完成后再后台给三个文本框赋值默认值,也可以规避初始化阶段的事件触发。
内容的提问来源于stack exchange,提问作者Gubbadubba
相关产品推荐
相关产品推荐

