如何使 isTextSearchEnabled 属性 在文本开头带有图标的组合框的情况下工作?

How to make isTextSearchEnabled property work in case of ComboBox with icons in the beginning of text?

在 ComboBox 中,我们可以通过键入项目的前几个字母来跳转到该项目。这是设置 IsTextSearchEnabled 属性 时,默认为 true。

我有一个自定义的 ComboBox,开头是图像,后面是简短的文本。

icon1 + Violet
icon2 + Red
icon3 + Blue

如果我键入 "r",我希望导航到下拉列表中的 Red 项。但是,由于开头有一个图标,IsTextSearchEnabled 属性 没有按预期运行。

我怎样才能使这个工作?

例如,在MyDropdown.cpp中,我有

MyDropDownItem^ comboItem = ref new MyDropDownItem(icon, title);
sourceItems->Append(comboItem);

sourceItems 是此控件的 ItemsSource 使用的项目列表。每个组合框项目都有不同的图像(图标),因此,图像源不能在 xaml 模板中静态定义。

How to make isTextEnabled property work in case of ComboBox with icons in the beginning of text?

您可以将 ComboBox ItemsSource 与字符串集合绑定,然后自定义项目内容,如下所示,当您输入文本时,它将与 ItemsSource.

匹配
<ComboBox
    x:Name="MyComboBox"
    Width="200"
    Header="Colors"
    IsEditable="True"
    Loaded="ComboBox_Loaded"     
    >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image
                    Width="22"
                    Height="22"
                    Source="Assets/StoreLogo.png"
                    />
                <TextBlock
                    Margin="10"
                    Text="{Binding}"
                    TextAlignment="Center"
                    />
            </StackPanel>
        </DataTemplate>

    </ComboBox.ItemTemplate>
</ComboBox>

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    MyComboBox.ItemsSource = new List<string>() { "Red", "Green", "Blue" };
}

更新

public class ImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        string resaut = string.Empty;
        switch (value.ToString())
        {
            case "Blue":
                resaut = "ms-appx:///Assets/BlueImage.png";
                break;
            case "Green":
                resaut = "ms-appx:///Assets/GreenImage.png";
                break;
            case "Red":
                resaut = "ms-appx:///Assets/RedImage.png";
                break;
            default:
                break;
        }
        return resaut;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

用法

<ComboBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <Image
                Width="22"
                Height="22"
                Source="{Binding Converter={StaticResource ImageConverter}}"
                />
            <TextBlock
                Margin="10"
                Text="{Binding}"
                TextAlignment="Center"
                />
        </StackPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>