项目筛选wpf时源突出显示

本文关键字:显示 筛选 wpf 项目 | 更新日期: 2023-09-27 18:05:26

我的数据绑定了一个ItemsSource。我有一个TextBox,当用户开始输入时,我会根据textBoxText更改事件上的以下Filter predicate过滤项目:

ICollectionView listView = CollectionViewSource.GetDefaultView(myControl.ItemsSource);
listView.Filter = ((x) => 
{           
    MyData data = x as MyData;
    return data.Name.Contains(searchString, System.StringComparison.InvariantCultureIgnoreCase);
});

这样可以很好地过滤列表。但是,我也希望项目在键入时以黄色突出显示输入的搜索条件。我如何在wpf中做到这一点?有点像:

如果我搜索"est",并且项目是Forest,则Forest项目以黄色或ListBox中的任何其他颜色突出显示est?谢谢你的建议。

项目筛选wpf时源突出显示

我通过创建一个自定义控件HighlightableTextBlock实现了这一点,该控件继承自TextBlock并添加了以下依赖属性:

    public string HighlightSource
    {
        get { return (string)GetValue(HighlightSourceProperty); }
        set { SetValue(HighlightSourceProperty, value); }
    }
    public static readonly DependencyProperty HighlightSourceProperty =
        DependencyProperty.Register("HighlightSource", typeof(string), typeof(HighlightableTextBlock), new PropertyMetadata("", OnChange));

OnChange事件处理程序中执行实际高亮显示:

    static void OnChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var textBlock = d as HighlightableTextBlock;
        var text = textBlock.Text;
        var source = textBlock.HighlightSource;
        if (!string.IsNullOrWhiteSpace(source) && !string.IsNullOrWhiteSpace(text))
        {
            var index = text.IndexOf(source);
            if (index >= 0)
            {
                var start = text.Substring(0, index);
                var match = text.Substring(index, source.Length);
                var end = text.Substring(index + source.Length);
                textBlock.Inlines.Clear();
                textBlock.Inlines.Add(new Run(start));
                textBlock.Inlines.Add(new Run(match) { Foreground = Brushes.Red });
                textBlock.Inlines.Add(new Run(end));
            }
        }
    }

标记方面的内容看起来是这样的:

<controls:HighlightableTextBlock Text="{Binding SomeText}"
                                 HighlightSource="{Binding ElementName=SearchTextBox, Path=Text}">
</controls:HighlightableTextBlock>

似乎在为我工作。在这个例子中,我已经对匹配的子字符串的颜色进行了硬编码,但如果您也想从标记中传递它,可以添加一个单独的属性。

希望这能帮助。。。