Я пишу пользовательский элемент управления с свойством зависимости для текста поиска, называемого SearchText. Это свойство зависимости, потому что я хочу, чтобы потребители элемента управления использовали привязку данных. Пользовательский элемент управления содержит текстовое поле WPF, в котором пользователь может ввести текст поиска.Проблема с UserControl с пользовательским свойством зависимостей
Я мог бы использовать привязку данных для подключения свойства зависимостей SearchText пользовательского элемента управления с свойством Text dependency TextBox, но это привязка срабатывает только тогда, когда текстовое поле теряет фокус ввода. Я хочу, чтобы 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");
}
}
}
К сожалению, этот сеттер не вызывается при вводе в текстовое поле. Любые идеи?
После выполнения 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}" />
но без эффекта.
Что-нибудь особенное, что я должен позаботиться об этих «цепных» креплениях?
Спасибо за этот намек! Но теперь есть проблема с двумя привязками, которые у меня есть сейчас, см. Мой обновленный вопрос. –
Мои две привязки работают, если я устанавливаю режим OneWayToSource, так что теперь все вопросы отвечают. Благодарю. –
Не заметил ваш обновленный ответ раньше ... Теперь я попробовал установить FrameworkPropertyMetadataOptions.BindsTwoWayByDefault и оставить обе привязки в двух направлениях - и это работает! Еще раз спасибо. –