c# - 如何过滤 AutoCompleteBox 中第一个匹配项的项目列表?

标签 c# wpf autocompletebox

我的目标是允许用户点击 Tab 键和自动完成框以立即选择下拉列表中的第一项。问题是我似乎无法弄清楚如何访问第一个过滤项目。有什么想法吗?

起初我以为属性 IsTextCompletionEnabled = true 可以解决我的问题。但是,如果我使用 FilterMode = Contains,文本完成功能将无济于事,因为什么都没有完成。

ItemsSource 实际上并没有改变。我需要获取过滤列表中的第一项而不是 itemssource。有办法吗?

这是我的代码:

   public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<Recording> MyMusic = new List<Recording>();

            MyMusic.Add(new Recording("Chris Sells", "Chris Sells Live", new DateTime(2008, 3, 5)));
            MyMusic.Add(new Recording("Chris Sells", "CSells Tells", new DateTime(2004, 4, 6)));
            MyMusic.Add(new Recording("Luka Abrus", "The Road to Redmond", new DateTime(2007, 8, 3)));
            MyMusic.Add(new Recording("Luka Abrus", "CLuka", new DateTime(2005, 12, 8)));
            MyMusic.Add(new Recording("Luka Abrus", "CLove and Luka", new DateTime(2005, 12, 8)));
            MyMusic.Add(new Recording("Jim Hance", "The Best of Jim Hance", new DateTime(2007, 2, 6)));

            Records.ItemsSource = MyMusic;
        }

        private void Records_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Tab)
                Records.SelectedItem = ((IEnumerable<object>)Records.ItemsSource).First();
        }
    }

    public class Recording
    {
        public Recording() { }
        public Recording(string artistName, string cdName, DateTime release)
        {
            Artist = artistName;
            Name = cdName;
            ReleaseDate = release;
        }
        public string Artist { get; set; }
        public string Name { get; set; }
        public DateTime ReleaseDate { get; set; }
    }

这是 xaml:

<Controls:AutoCompleteBox x:Name="Records" HorizontalAlignment="Left" Margin="164,142,0,0" VerticalAlignment="Top" Width="182"
                          ValueMemberPath="Name" KeyDown="Records_KeyDown"
                           FilterMode="Contains"
                          IsTextCompletionEnabled="True">
    <Controls:AutoCompleteBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"/>
        </DataTemplate>
    </Controls:AutoCompleteBox.ItemTemplate>
</Controls:AutoCompleteBox>

最佳答案

您只需将谓词传递给 First 方法,

    private void Records_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Tab)
        {
            Records.SelectedItem = 
                 Records.ItemsSource
                     .First(item => 
                         item.Name.Contains(textBoxValue) || 
                         item.Artist.Contains(textBoxValue));
        }
    }

这样,所选项目将是第一个匹配谓词的项目,或者在这种情况下,项目名称或艺术家包含文本框中当前值的第一个。

关于c# - 如何过滤 AutoCompleteBox 中第一个匹配项的项目列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20425635/

相关文章:

c# - 异步复制目录及其内容

c# - SecureString 到 Byte[] C#

wpf - 将两个元素的 Visibility 绑定(bind)到一个属性

c# - 如何从 Silverlight AutoCompleteBox 中获取所选项目?

javascript - Awesomplete - 获取选定的文本

c# - 如果序列为空,如何使 LINQ 的 Max 函数返回默认值?

c#构造函数外的基本关键字

c# - 用于在 HTML 中查找 WSDL 文件的正则表达式

c# - WPF 控件在窗口中的位置?

c# - AutoCompleteComboBox 向上箭头/向下箭头键滚动列表