Я хотел бы иметь элемент управления 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");
}
}
}
Я сделал справедливое немного исследований по этому вопросу, но я не совсем нашел ответ еще.
Спасибо! Это именно то, что я искал. – TeagansDad