我希望在表单上有一个ComboBox
控件,用于在用户输入时搜索投资列表。如果我在启动时缓存数据库中的整个投资集合(目前大约有3,000个项目),我可以轻松地做到这一点,但如果没有必要,我宁愿不这样做。
我想要实现的行为是:
我尝试将Text
的{{1}}属性绑定到ComboBox
上的InvestmentName
(字符串)属性,以及ViewModel
属性ItemsSource
ComboBox
InvestmentList
上的ViewModel
(通用列表)属性Text
。执行此操作时,ItemsSource
属性会从TextBox
自动完成,但下拉列表显示为空。
我已经能够使用ListBox
堆叠在TextBox
之上来实现这些结果,但它不是很优雅,它占用了更多的屏幕空间。我已经能够使ComboBox
堆叠在ComboBox
之上,但IsDropDownOpen
属性设置为<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
会抢占焦点当有有效搜索项时,“true”。为此,使用两个控件也不太令人愉悦。
我觉得我真的很接近让它以我想要的方式工作,但有些事情让我望而却步。
此控件的XAML是:
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");
}
}
}
相关{{1}}属性为:
{{1}}
我对此做了一些研究,但我还没有找到答案。
答案 0 :(得分:0)
通过我来查看关于CodeProject的这篇精彩文章:)
A Reusable WPF Autocomplete TextBox
看看Google建议示例的结尾,它类似于您所需要的,其中每个按键触发另一个查询到服务器。