Mat*_*och 5 c# data-binding wpf dependencies properties
我正在为一个名为SearchText的搜索文本编写一个带依赖项属性的用户控件.它是一个依赖属性,因为我想允许控件的使用者使用数据绑定.用户控件包含WPF TextBox,用户可以在其中输入搜索文本.
我可以使用数据绑定将用户控件的SearchText依赖项属性与TextBox的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;
}
...
}
Run Code Online (Sandbox Code Playgroud)
包含用户控件实例的窗口将其DataContext设置为具有也称为SearchText的属性的对象.
<uc:UserControlSearchTextBox SearchText="{Binding SearchText}" />
Run Code Online (Sandbox Code Playgroud)
Window的数据上下文:
public class DataSourceUserManual : DataSourceBase
{
private string _searchText;
public string SearchText
{
get { return _searchText; }
set
{
_searchText = value;
...
OnPropertyChanged("SearchText");
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我在文本框中输入时,不会调用此setter.有任何想法吗?
在遵循Quartermeisters提示后,我删除了TextBox_TextChanged事件处理程序并安装了一个绑定,使TextBox.Text和UserControl.SearchText保持同步.
<TextBox Text="{Binding ElementName=root,
Path=SearchText,
UpdateSourceTrigger=PropertyChanged}" />
Run Code Online (Sandbox Code Playgroud)
这种绑定似乎有效.但是现在用户控件和窗口的数据上下文之间的绑定被破坏(源永远不会更新).我已经改变了一点
<uc:UserControlSearchTextBox SearchText="{Binding Source={StaticResource ResourceKey=dataSource},
Path=SearchText}" />
Run Code Online (Sandbox Code Playgroud)
但没有效果.
关于这些"链式"绑定,我需要注意什么特别的事情?
通过将UpdateSourceTrigger从默认的LostFocus更改为PropertyChanged,可以强制TextBox在每次Text更改时更新绑定源:
<TextBox Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}" />
Run Code Online (Sandbox Code Playgroud)
请参阅有关Binding.UpdateSourceTrigger的MSDN文章.
在您更新的问题上,看起来源属性没有更新,因为您正在进行单向绑定.您可以通过指定模式在XAML中双向进行绑定:
<uc:UserControlSearchTextBox SearchText="{Binding Source={StaticResource ResourceKey=dataSource},
Mode=TwoWay,
Path=SearchText}" />
Run Code Online (Sandbox Code Playgroud)
或者,您可以在依赖项属性中指定FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,这是TextBox.Text的作用:
public static readonly DependencyProperty SearchTextProperty =
DependencyProperty.Register("SearchText", typeof(string), typeof(UserControlSearchTextBox), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3220 次 |
| 最近记录: |