WPF ComboBox с отложенной фильтрацией - PullRequest
2 голосов
/ 12 мая 2011

Рассмотрим следующую ситуацию: есть ComboBox и фильтр TextBox, затем пользователь вводит текст в текстовое поле. Источник элементов ComboBox обновляется с помощью фильтра текста. Все работает, но фильтрация происходит по каждой печатной букве. Я хочу добавить задержку до того, как произойдет фильтрация (фильтр не применяется, пока пользователь печатает). Какой самый простой способ сделать это?

1 Ответ

6 голосов
/ 12 мая 2011

Наиболее используемый способ сделать это - ввести таймер, в котором каждый раз, когда пользователь вводит новый символ, который сбрасывается вашим временным интервалом, но если он длиннее, чем x секунд, тогда выполняйте код.

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

Если вы используете модель представления, просто измените textbox1_TextChanged на соответствующий установщик свойств

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (!tmr.Enabled)
        {
            tmr.Enabled = true;
            tmr.Start();
        }


        TimeSinceType = DateTime.Now;

    }

public DateTime TimeSinceType { get; set; }

protected void Load()
{
      tmr = new Timer();
      tmr.Interval = 200;
      tmr.Elapsed += new ElapsedEventHandler(tmr_Elapsed);
}

void tmr_Elapsed(object sender, ElapsedEventArgs e)
{
    if ((DateTime.Now - TimeSinceType).Seconds > .5)
    {
        Dispatcher.BeginInvoke((Action)delegate()
        {
            //LoadData();
            tmr.Stop();
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...