1

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

    <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:更改 ComboBox 的 ItemTemplate 会删除在您键入时向下跳转列表的能力。有任何解决这个问题的方法吗?

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

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

4

2 回答 2

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)。我还听了 key up 事件-

   <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>
于 2013-11-07T19:30:36.297 回答
1

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

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

您必须实现自己的文本搜索机制才能获得所需的行为。尝试探索TextSearch实现想法的源代码。

于 2013-11-07T18:44:25.257 回答