IsTextSearchEnabled在ComboBox上无法正常工作

时间:2017-12-07 14:23:12

标签: c# wpf xaml

我正在尝试做什么

我正在尝试在AutoComplete上实施ComboBox功能而不使用WpfToolkit。如果我没错,ComboBox应该支持AutoComplete一个简单的字符串项,例如:

<ComboBox IsEditable="True">
    <ComboBoxItem>Apple</ComboBoxItem>
    <ComboBoxItem>Banana</ComboBoxItem>
    <ComboBoxItem>Pear</ComboBoxItem>
    <ComboBoxItem>Orange</ComboBoxItem>
</ComboBox>

当前对象实现

实际上我的ComboBox绑定了一个名为CheckedListItem的自定义对象,该对象具有以下结构:

public class CheckedListItem<T> : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private bool isChecked;
    private T item;

    public CheckedListItem() { }

    public CheckedListItem(T item, bool isChecked = false)
    {
        this.item = item;
        this.isChecked = isChecked;
    }

    public T Item
    {
        get { return item; }
        set
        {
            item = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Item"));
        }
    }

    public bool IsChecked
    {
        get { return isChecked; }
        set
        {
            isChecked = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsChecked"));
        }
    }
}

此课程在ComboBoxItem的{​​{1}}附近显示为CheckBox Text,类似于:

Item

其中[] Item1 [] Item2 ... []

ComboBox结构

Checkbox看起来像这样:

ComboBox

其中<ComboBox IsEditable="True" ItemSource={Binding Countries}/> Countries的{​​{1}},对象国家/地区是以这种方式实现的:

List

这段代码的问题是,当我在CheckedListItem<Country>中输入一些文本时,这不会做任何事情,但应该显示包含键入字符串的项目。

到目前为止我尝试了什么

我尝试通过实施public class Country { public string Name { get; set; } } 事件来解决此问题,实际上我是以这种方式管理的:

ComboBox

但这不能正常工作,因为如果我输入“England”,PreviewTextInput就会显示所有MyComboBox.IsDropDownOpen = true; CountryMenuComboBox.ItemsSource = Countries.Where(c => c.Item.Name.Contains(e.Text)).ToList();

有什么想法解决这个问题吗?

感谢。

1 个答案:

答案 0 :(得分:2)

尝试将TextSearch.TextPath属性设置为&#34; Item.Name&#34;:

<ComboBox IsEditable="True" ItemsSource="{Binding Countries}"
          TextSearch.TextPath="Item.Name">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <CheckBox IsChecked="{Binding Item.IsChecked}" />
                <TextBlock Text="{Binding Item.Name}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>