WPF Combobox通配符子串搜索

时间:2013-11-07 18:39:10

标签: c# wpf xaml

我在我的组合框中设置了以下属性 -

    <ComboBox ItemsSource="{Binding AllLines, Mode=OneWay}" Grid.Column="1" SelectedItem="{Binding SelectedLine}" Margin="4"
              Visibility="{Binding ShowLines, Converter={StaticResource BoolToVisible}}" AlternationCount="2"
              IsTextSearchEnabled="True" IsEditable="True" TextSearch.TextPath="SearchText" IsTextSearchCaseSensitive="False"
              ItemContainerStyle="{StaticResource alternatingWithTriggers}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Margin="2,0,2,0" FontWeight="Bold" Text="{Binding Description}"
                               Visibility="{Binding Description, Converter={StaticResource NullVisibilityConverter}}"></TextBlock>
                    <TextBlock Margin="2,2,2,4" Text="{Binding Designator}"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>                
    </ComboBox>

根据此处列出的建议,我添加了一个自定义搜索属性,其中包含我要搜索的三个属性。 WPF: Changing a ComboBox's ItemTemplate removes the ability to jump down the list as you type. Any way to fix this?

public string SearchText {get { return string.Format("{0} | {1} | {2}", Description, ID, Designator); }}

我的问题是,我可以对我的属性串联进行通配符或子字符串搜索吗?

2 个答案:

答案 0 :(得分:2)

在这里找到了一个想法,我从中建立了我的解决方案 - http://jacobmsaylor.com/?p=17

我做了一些小改动,例如听KeyUp而不是KeyDown,并使过滤器不区分大小写。我还添加了一个检查,以确保组合框文本(搜索文本)不为空或空。

在后面的代码中 -

public SelectRouteSegmentDialog()
{
    InitializeComponent();

    LineComboBox.Items.Filter += FilterPredicate;
}

private bool FilterPredicate(object obj)
{
    Line line = obj as Line;
    if (string.IsNullOrEmpty(LineComboBox.Text)) return true;

    if (line.SearchText != null)
    {
        if (line.SearchText.IndexOf(LineComboBox.Text, StringComparison.CurrentCultureIgnoreCase) >= 0)
        {
            return true;
        }
        return false;
    }
    else
    {
        //if the string is null, return false
        return false;
    }

}

private void combobox_KeyUp(object sender, KeyEventArgs e)
{
    if ((e.Key == Key.Enter) || (e.Key == Key.Tab) || (e.Key == Key.Return))
    {
        //Formatting options
        LineComboBox.Items.Filter = null;
    }
    else if ((e.Key == Key.Down) || (e.Key == Key.Up))
    {
        LineComboBox.IsDropDownOpen = true;
    }
    else
    {
        LineComboBox.IsDropDownOpen = true;
        LineComboBox.Items.Filter += this.FilterPredicate;
    }
}

xaml我设置IsEditable = true,IsTextSearchEnabled = false,TextSearch.TextPath等于我想要为我选择的项目显示的路径(否则只显示ToString)。我还会听取关键事件 -

   <ComboBox ItemsSource="{Binding AllLines, Mode=OneWay}" Grid.Column="1" SelectedItem="{Binding SelectedLine}" Margin="4"
             Visibility="{Binding ShowLines, Converter={StaticResource BoolToVisible}}" AlternationCount="2"
              IsEditable="True" TextSearch.TextPath="SearchText" IsTextSearchEnabled="False"
              ItemContainerStyle="{StaticResource alternatingWithTriggers}" x:Name="LineComboBox" KeyUp="combobox_KeyUp">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Margin="2,0,2,0" FontWeight="Bold" Text="{Binding DisplayText}"
                               Visibility="{Binding Description, Converter={StaticResource NullVisibilityConverter}}"></TextBlock>
                    <TextBlock Margin="2,2,2,4" Text="{Binding Designator}"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>                
    </ComboBox>

答案 1 :(得分:1)

  

我的问题是,我可以对我的属性串联进行通配符或子字符串搜索吗?

不使用内置TextSearch机制;它只是一个前缀匹配。您可以直接指定文本,或提供包含文本的属性的路径(如您所做),但您无法更改匹配行为。

您必须实现自己的文本搜索机制才能获得所需的行为。尝试浏览TextSearch源代码以了解实现方法。