WPF Binding Textbox для ViewModel - PullRequest
       8

WPF Binding Textbox для ViewModel

26 голосов
/ 17 марта 2011

У меня есть текстовое поле, которое привязано к свойству в моей ViewModel с именем DatabaseFilter

вот реализация свойства

public string DatabaseFilter {
    get { return _databaseFilter; }
    set { 
        _databaseFilter = value;
        FilterDatabases();
    }
}

как видите, я пытаюсь запустить фильтрацию на основе того, что введено в текстовое поле.

Проблема в том, что сеттер срабатывает, когда текстовое поле теряет фокус. Таким образом, ввод в текстовое поле ничего не делает, пока пользователь не нажмет TAB.

Можно ли сделать привязку обновлением нижележащей модели представления при каждом нажатии клавиши через связывание? Я хотел бы избежать необходимости добавлять события нажатия клавиш вниз / вверх, чтобы интерфейс пользователя / код был как можно более чистым.

Ответы [ 6 ]

43 голосов
/ 17 марта 2011

Установите UpdateSourceTrigger в вашем TextBox на PropertyChanged (по умолчанию LostFocus)

23 голосов
/ 17 марта 2011

Вам необходимо установить свойство UpdateSourceTrigger=PropertyChanged в выражении привязки, например,

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

Также доступны различные значения, например: Explicit - когда вам нужно явно вызвать update для привязки;LostFocus - это значение по умолчанию для TextBox, связывание обновлений после того, как элемент управления теряет фокус.

Необходимо помнить, что если ваше действие фильтрации выполняется в потоке пользовательского интерфейса, фильтрация после каждого нажатия клавиши может быть не самой разумной вещьюсделать, так как пользовательский опыт может серьезно пострадать от задержек, созданных этой фильтрацией.Если вы уверены, что вам нужно фильтровать после каждого нажатия клавиши, убедитесь, что фильтрация будет быстрой (например, есть только несколько элементов для фильтрации), или что вы будете фильтровать в фоновом потоке.

5 голосов
/ 17 марта 2011

Измените привязку, чтобы обновлять источник при каждом изменении свойства:

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

3 голосов
/ 17 марта 2011

Используйте свойство Binding.UpdateSourceTrigger в вашей привязке.По умолчанию источником обновления является потеря фокуса.Вы можете изменить его так, чтобы каждый раз, когда текст в текстовом поле менялся, привязка происходила.

см. http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx

3 голосов
/ 17 марта 2011

UpdateSourceTrigger=PropertyChanged должен решить эту проблему для вас

0 голосов
/ 17 марта 2011

Создайте команду в вашей виртуальной машине «FilterDatabaseCommand», привяжите событие «TextChanged» текстового поля к этой команде (используйте поведение EventToCommand).

Или просто измените свой код на это:

public string DatabaseFilter {
    get { return _databaseFilter; }
    set { 
        if(_databaseFilter != value) {
            _databaseFilter = value;
            FilterDatabases();
        }
    }
}
...