我已经看到很多关于实现具有ComboBox
功能的AutoComplete
的操作系统问题。我还看到一些tutorials显示了如何使用DLL。
这是我的ComboBox
的XAML:
<ComboBox x:Name="comboSongOpen"
ItemsSource="{StaticResource SongTitles}"
SelectedValuePath="Number"
SelectedValue="{Binding Meeting.OpenSong}"
ItemTemplate="{StaticResource SongListComboBoxItem}" />
看起来像:
我遇到的问题是我的ComboBox
是DropList
。没有必要允许用户在组合中键入文本,因为我们必须选择列表中的一个值。也就是说,某种AutoComplete
会很棒。具体来说,输入歌曲编号并将列表向下过滤等。
但我无法看到如何通过droplist样式组合实现它。
我试图按照评论中提供的链接进行操作,但这样做不对:
private void comboSongOpen_KeyDown(object sender, KeyEventArgs e)
{
if((e.Key >= Key.D0 && e.Key <= Key.D9) ||
(e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9))
{
ComboBox comboBox1 = sender as ComboBox;
SortedDictionary<int, SongTitleItem> dict = new SortedDictionary<int, SongTitleItem>();
int found = -1;
int current = comboBox1.SelectedIndex;
string number = "";
if (e.Key == Key.D0)
number = "0";
else if (e.Key == Key.D1)
number = "1";
else if (e.Key == Key.D2)
number = "2";
else if (e.Key == Key.D3)
number = "3";
else if (e.Key == Key.D4)
number = "4";
else if (e.Key == Key.D5)
number = "5";
else if (e.Key == Key.D6)
number = "6";
else if (e.Key == Key.D7)
number = "7";
else if (e.Key == Key.D8)
number = "8";
else if (e.Key == Key.D9)
number = "9";
// collect all items that match:
for (int i = 0; i < comboBox1.Items.Count; i++)
{
if (((SongTitleItem)comboBox1.Items[i]).Number.ToString().IndexOf(number) >= 0)
dict.Add(i, (SongTitleItem)comboBox1.Items[i]);
}
// find the one after the current position:
foreach (KeyValuePair<int, SongTitleItem> kv in dict)
if (kv.Key > current) { found = kv.Key; break; }
// or take the first one:
if (dict.Keys.Count > 0 && found < 0) found = dict.Keys.First();
if (found >= 0) comboBox1.SelectedIndex = found;
e.Handled = true;
}
}
我的If语句未被触发。此外,我必须继续将歌曲编号转换为文本。但为什么我的if语句失败了?
我添加了后者切换到至少得到正确的字符串值进行比较,但这似乎仍然存在缺陷。
如果我在015(例如)并且输入113,它将不会以113结束。并且似乎没有办法#34;回滚&#34;关于你输入的内容。