2009-12-30 3 views
0

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

Поведение, которое я пытаюсь реализовать это:

  • пользовательских типов текста в редактируемый ComboBox.
  • Поскольку пользователь вводит каждый символ, функция поиска базы данных запускается, сужая результаты поиска с каждым последующим нажатием клавиши.
  • Как обновляются результаты поиска, раскрывающаяся панель открывает и отображает соответствующих матчи

Я пытался связывать Text свойства ComboBox свойству InvestmentName (строка) на моем ViewModel, и ItemsSource недвижимости от ComboBox до InvestmentList (общий список) на моем ViewModel. Когда я это делаю, свойство Text автоматически завершается с ItemsSource, однако выпадающий список пуст.

Мне удалось достичь этих результатов, используя TextBox, уложенный сверху ListBox, но он не очень изящный и требует больше экранной недвижимости. Мне также удалось заставить его работать с TextBox, уложенным поверх ComboBox, хотя ComboBox перехватывает фокус, когда для свойства IsDropDownOpen установлено значение «true», когда есть действительные элементы поиска. Также не очень приятно использовать два элемента управления для этого.

Я чувствую, что я очень близко к тому, чтобы заставить его работать так, как я этого хочу, но есть что-то, что ускользает от меня.

Часть XAML для этого элемента управления:

<ComboBox Height="23" Width="260" IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Left" 
      ItemsSource="{Binding InvestmentList}" DisplayMemberPath="FullName" 
      IsDropDownOpen="{Binding DoShowInvestmentList}" 
      ItemsPanel="{DynamicResource ItemsTemplate}" IsEditable="True" 
      Text="{Binding Path=InvestmentName, Mode=TwoWay, 
       UpdateSourceTrigger=PropertyChanged}" /> 

Соответствующие ViewModel свойства:

private bool _doShowInvestmentList; 
    public bool DoShowInvestmentList 
    { 
     get { return _doShowInvestmentList; } 
     set { if (_doShowInvestmentList != value) { _doShowInvestmentList = value; RaisePropertyChanged("DoShowInvestmentList"); } } 
    } 

    private List<PFInvestment> _investmentList; 
    public List<PFInvestment> InvestmentList 
    { 
     get { return _investmentList; } 
     set { if (_investmentList != value) { _investmentList = value; RaisePropertyChanged("InvestmentList"); } } 
    } 

    private string _investmentName; 
    public string InvestmentName 
    { 
     get { return _investmentName; } 
     set 
     { 
      if (_investmentName != value) 
      { 
       _investmentName = value; 
       this.InvestmentList = DataAccess.SearchInvestmentsByName(value).ToList(); 

       if (this.InvestmentList != null && this.InvestmentList.Count > 0) 
        this.DoShowInvestmentList = true; 
       else 
        this.DoShowInvestmentList = false; 

       RaisePropertyChanged("InvestmentName"); 
      } 
     } 
    } 

Я сделал справедливое немного исследований по этому вопросу, но я не совсем нашел ответ еще.

ответ

0

Проверить эту большую статью на CodeProject по ... меня :)

A Reusable WPF Autocomplete TextBox

Посмотрите ближе к концу на примере Google Suggest, это похоже на то, что вам нужно, где каждый нажатие вызывает другой запрос к серверу.

+0

Спасибо! Это именно то, что я искал. – TeagansDad