【问题标题】:WPF Combobox Autocomplete TextSearch like "Contains" instead of "Start with"WPF 组合框自动完成文本搜索,如“包含”而不是“开始于”
【发布时间】:2020-03-15 19:06:48
【问题描述】:

我正在尝试实现 WPF 组合框自动完成文本搜索,例如“包含”而不是“开始于”。

有几个问题线程,但找不到任何具体的解决方案。

我正在关注@Evgenii 的回答: WPF combobox textsearch with contains

在SetText(DependencyObject element, string text) 方法中,“text”参数的值始终是“DeviceNumber”字符串。所以我的文字没有反映在那里。

这是我自己的示例代码 https://drive.google.com/open?id=1eqK5bh5SQJPxHeb-zzOuBHIpYapv-h18

有什么原因吗?

有人成功实现了包含包含的文本搜索吗? 请指导。

感谢您给我的每一个答案,但工作代码非常可观:)

【问题讨论】:

  • 感谢@NawedNabiZada。在写这篇文章之前我试过了。它不起作用。我又试了一次,但没有运气。
  • 你的问题太宽泛了,我怀疑有人会努力点击谷歌驱动器的链接来下载你的解决方案。我会建议您重试上面链接中提供的代码,并就您将面临的问题提出问题。确保创建一个minimal reproducible example
  • 没有不好的感觉。 Stackoverflow 不是讨论论坛,因为指南描述您当前的问题过于宽泛。您仍然需要创建一个 MCVE。

标签: c# wpf combobox autocomplete text-search


【解决方案1】:

制作自定义组合框控件。

public class SearchComboBox : ComboBox
{
    TextBox editableTextBox;

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        editableTextBox = GetTemplateChild("PART_EditableTextBox") as TextBox;

        editableTextBox.TextChanged += EditableTextBox_TextChanged;
    }

    private void EditableTextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        ICollectionView ICV = ItemsSource as ICollectionView;

        if(ICV != null)
        {
            if (string.IsNullOrEmpty(editableTextBox.Text.Trim()))
                ICV.Filter = null;
            else
                ICV.Filter = new Predicate<object>(i => ((Equipment)i).equipmentLabel.Contains(editableTextBox.Text));

            IsDropDownOpen = true;
        }

    }
}

修改你的 EquipmentScreenViewModel 代码。添加ICollectionView类型属性

public  class EquipmentScreenViewModel
{
    public string SelectedEquipmentRego { get; set; }
    public ObservableCollection<Equipment> AllEquipments { get; set; }

    private ICollectionView _allEquipCollection = null;

    public ICollectionView AllEquipCollection
    {
        get
        {
            if (_allEquipCollection == null && AllEquipments != null)
            {
                _allEquipCollection = CollectionViewSource.GetDefaultView(AllEquipments);
            }

            return _allEquipCollection;
        }
    }
}

XAML

<Grid>
    <local:SearchComboBox x:Name="cmbAlternativeAsset" 
                            Width="200" IsEditable="True" 
                            FontSize="12" Foreground="#494949"
                            VerticalAlignment="Center"
                            HorizontalAlignment="Stretch"   
                            SelectedItem="{Binding SelectedEquipmentRego, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                            ItemsSource="{Binding AllEquipCollection}" SelectedValuePath="equipmentRego"
                            DisplayMemberPath="equipmentLabel" IsTextSearchEnabled="False"
        />
</Grid>

将 ItemsSource 绑定到 CollectionView 和 IsTextSearchEnabled 为 false。祝你好运

【讨论】:

    【解决方案2】:

    我推荐使用AutoCompleteBox,它就像ComboBox,它有ItemsSourceSelectedItem,都像ComboBox

    您可以使用它的属性“AutoCompleteBox.FilterMode”,它采用AutoCompleteFilterMode 枚举,枚举包括:ContainsContainsCaseSensitiveContainsOrdinal 和其他有用的... 这是你如何使用它:

    https://www.broculos.net/2014/04/wpf-autocompletebox-autocomplete-text.html 这里是一个使用过滤模式的例子:

    https://docs.microsoft.com/en-us/previous-versions/windows/silverlight/dotnet-windows-silverlight/dd833103(v=vs.95)?redirectedfrom=MSDN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-14
      • 2018-02-05
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多