【问题标题】:How to filter a list of items for the first match in a AutoCompleteBox?如何过滤 AutoCompleteBox 中第一个匹配项的列表?
【发布时间】:2013-12-06 13:54:33
【问题描述】:

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

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

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>

【问题讨论】:

    标签: c# wpf autocompletebox


    【解决方案1】:

    您只需将谓词传递给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));
            }
        }
    

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

    【讨论】:

    • 真棒就像一个魅力。为了让它发挥作用,我必须让它更适合我的情况,但这很好用。这是我所做的: if (e.Key == Key.Tab) { Records.SelectedItem = ((IEnumerable)Records.ItemsSource) .First(item => item.Name.Contains(Records.Text) | | item.Artist.Contains(Records.Text));
    • 顺便说一句,您不需要将其转换为IEnumerable&lt;Recording&gt;List&lt;T&gt; 已经实现了IEnumerable&lt;T&gt;,所以不需要转换,如答案所示。
    • 我也是这么想的。但由于某种原因,在我的代码 Records.ItemsSource 中显示 IEnumerable(不是 IEnumerable,只是 IEnumerable)。我不知道为什么。
    • Records 是在哪里定义的?
    • 记录是一个 System.Windows.Controls.AutoCompleteBox。如上所示,它在 xaml 中定义。控件是 xmlns:Controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit"
    【解决方案2】:

    Records.SelectedItem = Records.Items[0]; ?

    【讨论】:

    • -1 这不会过滤项目,它只是返回第一个,可能与输入不匹配。
    猜你喜欢
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2020-02-07
    • 2021-01-07
    • 1970-01-01
    相关资源
    最近更新 更多