有关AutoCompleteBox组件的研究[3]_FilterMode和ItemFilter——Silverlight学习笔记[38]

本文介绍如何为AutoCompleteBox组件设置不同过滤模式(FilterMode),包括起始匹配、包含匹配及完全匹配等,并演示了如何实现自定义过滤规则。

对于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;

        }

    }

}

 

最终效果图:

图一:起始过滤大小写敏感模式

 


图二:自定义过滤模式

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

转载于:https://www.cnblogs.com/Kinglee/archive/2009/09/28/1575993.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值