2010-06-16 2 views
4

Я пишу пользовательский элемент управления с свойством зависимости для текста поиска, называемого 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}" /> 

но без эффекта.

Что-нибудь особенное, что я должен позаботиться об этих «цепных» креплениях?

ответ

4

Вы можете заставить TextBox обновлять источник привязки каждый раз, когда изменения текста путем изменения UpdateSourceTrigger в PropertyChanged от дефолта LostFocus:

<TextBox Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}" /> 

Смотрите статью MSDN на Binding.UpdateSourceTrigger.

По вашему обновленному вопросу, похоже, что свойство source не обновляется, потому что вы выполняете одностороннюю привязку. Вы можете сделать это связывание двухстороннюю в XAML, указав Mode:

<uc:UserControlSearchTextBox SearchText="{Binding Source={StaticResource ResourceKey=dataSource}, 
               Mode=TwoWay, 
               Path=SearchText}" /> 

Или вы можете указать FrameworkPropertyMetadataOptions.BindsTwoWayByDefault в вашей собственности зависимости, что и делает TextBox.Text:

public static readonly DependencyProperty SearchTextProperty = 
    DependencyProperty.Register("SearchText", typeof(string), typeof(UserControlSearchTextBox), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 
+0

Спасибо за этот намек! Но теперь есть проблема с двумя привязками, которые у меня есть сейчас, см. Мой обновленный вопрос. –

+0

Мои две привязки работают, если я устанавливаю режим OneWayToSource, так что теперь все вопросы отвечают. Благодарю. –

+0

Не заметил ваш обновленный ответ раньше ... Теперь я попробовал установить FrameworkPropertyMetadataOptions.BindsTwoWayByDefault и оставить обе привязки в двух направлениях - и это работает! Еще раз спасибо. –

0

Необходимо указать параметр PropertyChangedCallback для конструктора UIPropertyMetadata.

Эта статья CodeProject делает именно то, что вы хотите. См. Как использовать API поиска Windows Vista из приложения WPF по адресу http://www.codeproject.com/KB/WPF/Vista_Search_in_WPF.aspx.

... 
    new UIPropertyMetadata(
     default(string), 
     new PropertyChangedCallback(TextBox_TextChanged) 
    ) 
    ... 

    static void TextBox_TextChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { 
     ... 
    } 
+0

Спасибо за ваш ответьте, но я думаю, что это не совсем то, что мне нужно. Возможно, вы можете посмотреть мой обновленный вопрос. –

+0

Все вопросы ответили прямо сейчас. Благодарю. –

Смежные вопросы