Подтвердить что ты не робот

Текстовое поле привязки WPF к ViewModel

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

здесь реализуется свойство

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

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

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

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

4b9b3361

Ответ 1

Установите UpdateSourceTrigger в свой текстовый блок на PropertyChanged (который по умолчанию равен LostFocus)

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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