自定义WPF用户控件触发TextChanged但无法获取新输入文本
问题根因
你自定义控件的Text是普通CLR属性,不具备WPF属性系统的变更通知能力,且和控件内部的TextBox的输入内容没有建立同步关联:用户输入的内容只会更新内部TextBox的Text值,不会同步到你自定义的SearchBox.Text属性,因此读取时永远返回XAML初始化时的预设值。
解决方案
你需要将Text改为依赖属性,并建立内部TextBox和该属性的双向绑定,步骤如下:
1. 替换普通Text属性为依赖属性
修改后台SearchBox.xaml.cs代码,将原来的public string Text { get; set; }替换为依赖属性定义:
public partial class SearchBox : UserControl { public SearchBox() { InitializeComponent(); this.DataContext = this; } // 新增Text依赖属性定义 public static readonly DependencyProperty TextProperty = DependencyProperty.Register( nameof(Text), typeof(string), typeof(SearchBox), new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault) ); public string Text { get => (string)GetValue(TextProperty); set => SetValue(TextProperty, value); } // 原有其他逻辑保留不变 private void TextBox_GotFocus(object sender, RoutedEventArgs e) { if (sender is TextBox textBox && textBox.Tag.ToString() == textBox.Text) textBox.Clear(); } private void TextBox_LostFocus(object sender, RoutedEventArgs e) { if (sender is TextBox textBox && string.IsNullOrEmpty(textBox.Text)) textBox.Text = textBox.Tag.ToString(); } public event TextChangedEventHandler TextChanged; private void TextBox_TextChanged(object sender, TextChangedEventArgs args) { TextChanged?.Invoke(this, args); } }
2. 绑定内部TextBox的Text到自定义属性
修改SearchBox.xaml中内部TextBox的定义,添加Text的双向绑定:
<TextBox x:Name="InnerTextBox" Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" GotFocus="TextBox_GotFocus" LostFocus="TextBox_LostFocus" TextChanged="TextBox_TextChanged" <!-- 你原有其他样式、Tag等属性保持不变 --> />
这里指定UpdateSourceTrigger=PropertyChanged是为了让用户每输入一个字符就同步更新SearchBox.Text,而不是等到TextBox失去焦点才更新。
修改完成后,用户输入的内容会实时同步到SearchBox.Text,调用searchBox.Text就能拿到最新的输入值。
内容的提问来源于stack exchange,提问作者Manolo Martinez
相关产品推荐
相关产品推荐

