有关AutoCompleteBox组件的研究[3]_FilterMode和ItemFilter——Silverlight学习笔记[38]
对于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。此时,即可通过设置AutoCompleteBox的ItemFilter属性来设置自定义过滤。
实例:
详细的说明在代码注释中给出。
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和字符n的EmployeeName返回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("
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’s Blog (http://www.cnblogs.com/Kinglee/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。