简体   繁体   中英

Filtering of combobox in c# wpf

XAML:

<ComboBox x:Name="cmb" HorizontalAlignment="Left" 
              Margin="183,39,0,0" 
              VerticalAlignment="Top" 
              Width="120" 
              ItemsSource="{Binding FilteredNames, Mode=OneWay}"
              IsTextSearchEnabled="True"
              IsEditable="True"
              TextSearch.Text="{Binding Filter, UpdateSourceTrigger=PropertyChanged}"/>

ViewModel:

public List<string> FilteredNames
{
    get
    {
        return (names.FindAll(x => x.Contains(filter))).ToList<string>();
    }
}

public string Filter
{
    get
    {
        return this.filter;
    }
    set
    {
        this.filter = value;
        NotifyPropertyChanged("FilteredNames");
    }
}

public ViewModel()
{
    this.names = new List<string>() { "Jerry", "Joey", "Roger", "Raymond", "Jessica", "Mario", 
                                              "Jonathan" };
    this.filter = "";
}

This is what I have implemented. Please help me out how to get filtered dropdown in combobox. Like when I input "j", I want to get all the items containing "j" in it.

You should bind string input to ComboBox's Text property:

Text="{Binding Filter, UpdateSourceTrigger=PropertyChanged}"

Also I would suggest using CollectionView for filtering like this:

public ICollectionView FilteredNames { get; set; }
IList<string> names = new List<string>() { "Jerry", "Joey", "Roger", "Raymond", "Jessica", "Mario", "Jonathan" };

public VM()
{
    FilteredNames = CollectionViewSource.GetDefaultView(names);
    FilteredNames.Filter = (obj) => 
    {
        if (!(obj is string str))
            return false;

        return str.Contains(filter);
    };
}

string filter = "";
public string Filter
{
    get 
    {
        return this.filter;
    }
    set 
    {
        this.filter = value;
        FilteredNames?.Refresh();
    }
}

XAML:

<ComboBox x:Name="cmb" HorizontalAlignment="Left" 
              Margin="183,39,0,0" 
              VerticalAlignment="Top" 
              Width="120" 
              ItemsSource="{Binding FilteredNames, Mode=OneWay}"
              IsTextSearchEnabled="True"
              IsEditable="True"
              TextSearch.Text="{Binding Filter, UpdateSourceTrigger=PropertyChanged}"/>

ViewModel:

public List<string> FilteredNames
{
    get
    {
        return (names.FindAll(x => x.Contains(filter))).ToList<string>();
    }
}

public string Filter
{
    get
    {
        return this.filter;
    }
    set
    {
        this.filter = value;
        NotifyPropertyChanged("FilteredNames");
    }
}

public ViewModel()
{
    this.names = new List<string>() { "Jerry", "Joey", "Roger", "Raymond", "Jessica", "Mario", 
                                              "Jonathan" };
    this.filter = "";
}

This is what I have implemented. Please help me out how to get filtered dropdown in combobox. Like when I input "j", I want to get all the items containing "j" in it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM