在DropList样式ComboBox上使用AutoComplete

时间:2016-07-12 12:26:17

标签: c# wpf xaml combobox autocomplete

我已经看到很多关于实现具有ComboBox功能的AutoComplete的操作系统问题。我还看到一些tutorials显示了如何使用DLL。

这是我的ComboBox的XAML:

<ComboBox x:Name="comboSongOpen" 
            ItemsSource="{StaticResource SongTitles}"
            SelectedValuePath="Number"
            SelectedValue="{Binding Meeting.OpenSong}"
            ItemTemplate="{StaticResource SongListComboBoxItem}" />

看起来像:

Songs presented in the combo

我遇到的问题是我的ComboBoxDropList。没有必要允许用户在组合中键入文本,因为我们必须选择列表中的一个值。也就是说,某种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;关于你输入的内容。

0 个答案:

没有答案