对于AutoCompleteBox组件而言,设置合理的过滤模式有利于对数据的精确筛选。本文将为大家介绍如何为该组件设置不同的过滤模式(FilterMode)以及设置自定义项过滤(ItemFilter)

 

※ 过滤模式

AutoCompleteBox组件的默认过滤模式是起始匹配同时非字母大小写敏感。但有时我们需要使用到其他的过滤模式。下表列出了AutoCompleteBox组件FilterMode的可选值。

 

FilterMode的可选值

说明

None

指定不使用筛选器。将返回所有项。

StartsWith

指定区分区域性但不区分大小写的筛选器,其中返回的项以指定的文本开头。该筛选器使用 String.StartsWith 方法,并且将 StringComparer.CurrentCultureIgnoreCase 指定为字符串比较条件。

StartsWithCaseSensitive

指定区分区域性且区分大小写的筛选器,其中返回的项以指定的文本开头。该筛选器使用 String. StartsWith 方法,并且将 StringComparer. CurrentCulture 指定为字符串比较条件。

StartsWithOrdinal

指定带序号的不区分大小写的筛选器,其中返回的项以指定的文本开头。该筛选器使用 String.StartsWith 方法,并且将 StringComparer.OrdinalIgnoreCase 指定为字符串比较条件。

StartsWithOrdinalCaseSensitive

指定带序号的区分大小写的筛选器,其中返回的项以指定的文本开头。该筛选器使用 String.tartsWith 方法,并且将 StringComparer.Ordinal 指定为字符串比较条件。

Contains

指定区分区域性但不区分大小写的筛选器,其中返回的项包含指定的文本。

ContainsCaseSensitive

指定区分区域性且区分大小写的筛选器,其中返回的项包含指定的文本。

ContainsOrdinal

指定带序号的不区分大小写的筛选器,其中返回的项包含指定的文本。

ContainsOrdinalCaseSensitive

指定带序号的区分大小写的筛选器,其中返回的项包含指定的文本。

Equals

指定区分区域性但不区分大小写的筛选器,其中返回的项等于指定的文本。该筛选器使用 String.Equals 方法,且将StringComparer. CurrentCultureIgnoreCase 指定为搜索比较条件。

EqualsCaseSensitive

指定区分区域性且区分大小写的筛选器,其中返回的项等于指定的文本。该筛选器使用 String.Equals 方法,并且将 StringComparer.CurrentCulture 指定为字符串比较条件。

EqualsOrdinal

指定带序号的不区分大小写的筛选器,其中返回的项等于指定的文本。该筛选器使用 String.Equals 方法,并且将 StringComparer.OrdinalIgnoreCase 指定为字符串比较条件。

EqualsOrdinalCaseSensitive

指定带序号的区分大小写的筛选器,其中返回的项等于指定的文本。该筛选器使用 String.Equals 方法,并且将 StringComparer.Ordinal 指定为字符串比较条件。

Custom

指定使用自定义筛选器。在设置了 AutoCompleteBox.TextFilter AutoCompleteBox.ItemFilter 属性时使用此模式。

引自:MSDN AutoCompleteFilterMode 枚举

 

※ 项过滤

有时候我们需要自定义过滤规则时,就将FilterMode设为Custom。此时,即可通过设置AutoCompleteBoxItemFilter属性来设置自定义过滤。

 

实例:

详细的说明在代码注释中给出。

 

MainPage.xaml文件代码

<UserControl

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    mc:Ignorable="d" xmlns:input="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input" x:Class="SilverlightClient.MainPage"

    d:DesignWidth="320" d:DesignHeight="240">

    <Grid x:Name="LayoutRoot" Width="320" Height="240" Background="White">

 

        <input:AutoCompleteBox x:Name="acb" Height="23" Margin="8,43,148,0" VerticalAlignment="Top"/>

        <TextBlock Height="23" HorizontalAlignment="Left" Margin="8,0,0,75" VerticalAlignment="Bottom" Width="103" Text="过滤模式:" TextWrapping="Wrap" FontSize="16"/>

        <ComboBox x:Name="cbFilterMode" Margin="8,0,69,30" Height="25" VerticalAlignment="Bottom"/>

 

    </Grid>

</UserControl>

 

MainPage.xaml.cs文件代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

 

namespace SilverlightClient

{

    //业务辅助类

    public class FilterModeHelper

    {

        public string FilterModeName { get; set; }

        public AutoCompleteFilterMode theFilterMode { get; set; }

    }

   

    public partial class MainPage : UserControl

    {

        public MainPage()

        {

            InitializeComponent();

            this.Loaded += new RoutedEventHandler(MainPage_Loaded);

            this.cbFilterMode.SelectionChanged +=

                new SelectionChangedEventHandler(cbFilterMode_SelectionChanged);

        }

 

        void cbFilterMode_SelectionChanged(object sender, SelectionChangedEventArgs e)

        {

            if (cbFilterMode.SelectedItem != null)

            {

                FilterModeHelper fmh = cbFilterMode.SelectedItem as FilterModeHelper;

                if (fmh.FilterModeName == "Custom")

                {

                    acb.FilterMode = fmh.theFilterMode;

                    acb.ItemFilter = (search, item) =>

                    {

                        string employeename = item as string;

                        if (employeename != null)

                        {

                            string filter = search.ToLower();

                            //包含filter和字符nEmployeeName返回true

                            return employeename.ToLower().Contains(filter) ||

                                employeename.ToLower().Contains("n");

                        }

 

                        return false;

 

                    };

                }

                else

                {

                    acb.FilterMode = fmh.theFilterMode;

                    acb.ItemFilter = null;

                }

            }

        }

 

        void MainPage_Loaded(object sender, RoutedEventArgs e)

        {

            //cbFilterMode提供数据源

            cbFilterMode.ItemsSource = GetFilter();

            cbFilterMode.DisplayMemberPath = "FilterModeName";

            //AutoCompleteBox提供数据源

            acb.ItemsSource = GetEmployeeName();

        }

 

        //cbFilterMode的数据源

        List<FilterModeHelper> GetFilter()

        {

            List<FilterModeHelper> returnedValue = new List<FilterModeHelper>();

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "None", theFilterMode = AutoCompleteFilterMode.None });

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "StartsWith", theFilterMode = AutoCompleteFilterMode.StartsWith });

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "StartsWithCaseSensitive", theFilterMode = AutoCompleteFilterMode.StartsWithCaseSensitive });

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "StartsWithOrdinal", theFilterMode = AutoCompleteFilterMode.StartsWithOrdinal });

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "StartsWithOrdinalCaseSensitive", theFilterMode = AutoCompleteFilterMode.StartsWithOrdinalCaseSensitive });

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "Contains", theFilterMode = AutoCompleteFilterMode.Contains });

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "ContainsCaseSensitive", theFilterMode = AutoCompleteFilterMode.ContainsCaseSensitive });

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "ContainsOrdinal", theFilterMode = AutoCompleteFilterMode.ContainsOrdinal });

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "ContainsOrdinalCaseSensitive", theFilterMode = AutoCompleteFilterMode.ContainsOrdinalCaseSensitive });

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "Equals", theFilterMode = AutoCompleteFilterMode.Equals });

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "EqualsCaseSensitive", theFilterMode = AutoCompleteFilterMode.EqualsCaseSensitive });

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "EqualsOrdinal", theFilterMode = AutoCompleteFilterMode.EqualsOrdinal });

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "EqualsOrdinalCaseSensitive", theFilterMode = AutoCompleteFilterMode.EqualsOrdinalCaseSensitive });

            returnedValue.Add(new FilterModeHelper() { FilterModeName = "Custom", theFilterMode = AutoCompleteFilterMode.Custom });

            return returnedValue;

        }

 

        //AutoCompleteBox的数据源

        List<string> GetEmployeeName()

        {

            List<string> returnedValue = new List<string>();

            returnedValue.Add("Alice");

            returnedValue.Add("Allen");

            returnedValue.Add("Benedict");

            returnedValue.Add("Bill");

            returnedValue.Add("Black");

            returnedValue.Add("Charles");

            returnedValue.Add("Chasel");

            returnedValue.Add("Dave");

            returnedValue.Add("David");

            returnedValue.Add("Dean");

            return returnedValue;

        }

    }

}

 

最终效果图:
有关AutoCompleteBox组件的研究[3]_FilterMode和ItemFilter——Silverlight学习笔记[38]
图一:起始过滤大小写敏感模式

 

有关AutoCompleteBox组件的研究[3]_FilterMode和ItemFilter——Silverlight学习笔记[38]
图二:自定义过滤模式

 
作者:Kinglee
文章出处:Kinglee’s Blog (http://www.cnblogs.com/Kinglee/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。

相关文章:

  • 2022-01-15
  • 2021-06-16
  • 2022-03-07
  • 2021-08-14
  • 2021-12-26
  • 2021-12-13
  • 2021-05-29
猜你喜欢
  • 2022-01-23
  • 2021-12-27
  • 2021-09-15
  • 2021-12-23
  • 2021-07-08
  • 2022-12-23
相关资源
相似解决方案