Search code examples
c#wpfcomboboxautocompletetext-search

WPF Combobox Autocomplete TextSearch like "Contains" instead of "Start with"


I am trying to implement WPF Combobox Autocomplete TextSearch like "Contains" instead of "Start with".

Couple of question threads are there but could not find any concrete solution.

I was following the answer by @Evgenii: WPF combobox textsearch with contains

In the SetText(DependencyObject element, string text) method, the value of "text" parameter is always a "DeviceNumber" string. So my text is not reflecting there.

Here is my own sample code https://drive.google.com/open?id=1eqK5bh5SQJPxHeb-zzOuBHIpYapv-h18

Any reason?

Is anyone successfully implemented Text Search with Contains? Please guide.

I thank you for every answer I get but working code is much appreciable :)


Solution

  • make custom combobox control.

    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;
            }
    
        }
    }
    

    modify you EquipmentScreenViewModel Code. add ICollectionView type property

    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>
    

    Binding ItemsSource to CollectionView and IsTextSearchEnabled false. Good Luck