WPF中如何在TextBox内容变化时修改TextBlock的TextString内容
问题根因
你遇到的System.NullReferenceException空引用异常由两个问题共同导致:
- XAML中已经为
TextBox声明了TextChanged="TextBox_TextChanged"事件绑定,在InitializeComponent()执行过程中,解析XAML给TextBox赋值初始文本Text="TextBox"时会触发TextBox_TextChanged事件,此时TextString控件还没完成初始化,值为null,访问TextString.Text就会抛出空引用异常。 - 后台构造函数中又重复订阅了一次
TextChanged事件,属于多余操作,会导致后续文本变更时事件触发两次。
解决方案
你可以任选以下一种方式修改:
方式1:移除XAML中的事件声明,仅保留后台订阅
删除XAML里TextBox的TextChanged="TextBox_TextChanged"属性即可,这样只有构造函数里InitializeComponent()执行完成、所有控件都初始化后才会订阅事件,不会触发初始化阶段的空引用。
修改后的XAML对应TextBox代码:
<TextBox x:Name="textBox" HorizontalAlignment="Left" Margin="296,161,0,0" Text="TextBox" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
后台代码无需额外调整。
方式2:保留XAML的事件声明,移除后台重复订阅,同时加空值判断
- 删掉构造函数里的
this.textBox.TextChanged += TextBox_TextChanged;代码行,避免重复订阅。 - 给
TextBox_TextChanged方法加上空值判断,避免初始化阶段控件未加载完成导致的空引用:
修改后的后台方法代码:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { if (TextString != null && textBox != null) { TextString.Text = textBox.Text; } }
最优实践(推荐)
WPF原生支持数据绑定,无需手写事件即可实现两个控件内容联动,直接修改XAML中TextBlock的Text属性绑定到TextBox的Text即可,不需要任何事件相关的后台代码:
<TextBlock x:Name="TextString" HorizontalAlignment="Left" Margin="459,163,0,0" Text="{Binding ElementName=textBox, Path=Text}" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
该方式代码更简洁,也从根源上避免了空引用问题。
内容的提问来源于stack exchange,提问作者홍영주
相关产品推荐
相关产品推荐

