我正在编写一个用户控件,其中包含一个名为SearchText的搜索文本依赖属性。这是一个依赖属性,因为我希望控件的使用者能够使用数据绑定。用户控件包含一个WPF TextBox,用户可以在其中输入搜索文本。
我可以使用数据绑定将用户控件的SearchText依赖属性与TextBox的Text依赖属性连接起来,但是此绑定仅在文本框失去输入焦点时触发。我想要的是每次更改Text后都更新SearchText。
因此,我在用户控件中添加了一个TextChanged事件处理程序,在其中将SearchText设置为Text的值。
我的问题是,SearchText绑定不起作用,源永远不会更新。我做错了什么?
以下是用户控件代码后台的相关部分:
窗口的数据上下文:
我可以使用数据绑定将用户控件的SearchText依赖属性与TextBox的Text依赖属性连接起来,但是此绑定仅在文本框失去输入焦点时触发。我想要的是每次更改Text后都更新SearchText。
因此,我在用户控件中添加了一个TextChanged事件处理程序,在其中将SearchText设置为Text的值。
我的问题是,SearchText绑定不起作用,源永远不会更新。我做错了什么?
以下是用户控件代码后台的相关部分:
public partial class UserControlSearchTextBox : UserControl
{
public string SearchText
{
get { return (string)GetValue(SearchTextProperty); }
set { SetValue(SearchTextProperty, value); }
}
public static readonly DependencyProperty SearchTextProperty =
DependencyProperty.Register("SearchText", typeof(string), typeof(UserControlSearchTextBox), new UIPropertyMetadata(""));
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
SearchText = ((TextBox)sender).Text;
}
...
}
包含用户控件实例的窗口其DataContext被设置为一个也称为SearchText的属性的对象。
<uc:UserControlSearchTextBox SearchText="{Binding SearchText}" />
窗口的数据上下文:
public class DataSourceUserManual : DataSourceBase
{
private string _searchText;
public string SearchText
{
get { return _searchText; }
set
{
_searchText = value;
...
OnPropertyChanged("SearchText");
}
}
}
很遗憾,当我输入文本框时,此setter不会被调用。有什么想法吗?
在按照Quartermeisters的提示后,我已经移除了TextBox_TextChanged事件处理程序,并安装了一个绑定来保持TextBox.Text和UserControl.SearchText同步。
<TextBox Text="{Binding ElementName=root,
Path=SearchText,
UpdateSourceTrigger=PropertyChanged}" />
这个绑定似乎起作用了。但是现在用户控件与窗口的数据上下文之间的绑定已经断开了(源永远不会更新)。我稍微改变了它
<uc:UserControlSearchTextBox SearchText="{Binding Source={StaticResource ResourceKey=dataSource},
Path=SearchText}" />
但是没有任何效果。
关于这些“链接”绑定,我需要特别注意什么吗?