AutoCompleteBox - 如何从匹配项目的集合中选择特定项目?

如何解决AutoCompleteBox - 如何从匹配项目的集合中选择特定项目?

使用 autocompletebox 时 - 我有一个具有匹配显示文本的项目列表 - 但 ID 值不同。

[{Text:"John",Id:1},{Text:"John",Id:2},{Text:"John Doe",Id:3}]

enter image description here

当我选择第二行 (John #2) - 第一个值 (John #1) 设置为 SelectedItem 属性。选择不同的值时(John Doe #3) - 它可以正常工作。

我的观察是,如果有更多匹配项 - 它总是取第一个

我该怎么做才能将正确的项目(John #2)设置为 SelectedItem?

<controls2:autocompletebox 
   EraseTextIfNull="False"
   ValueMemberBinding="{Binding Converter={StaticResource AutocompleteItemTextConverter}}"
   ItemsSource="{Binding TestItemSource,RelativeSource={RelativeSource TemplatedParent}}"
   SelectedItem="{Binding TestSelectedItem,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}"
   Text="{Binding TestText,RelativeSource={RelativeSource TemplatedParent}}" 
   ItemTemplate="{Binding Source={StaticResource TestItemTemplate}}"
 />

视图模型:

public class TestItemDto
{
    public int Id { get; set; }
    public string Text { get; set; }
}

private ObservableCollection<TestItemDto> _testItemSource = new ObservableCollection<TestItemDto>
{
    new TestItemDto
    {
        Id = 1,Text = "John"
    },new TestItemDto
    {
        Id = 2,new TestItemDto
    {
        Id = 3,Text = "John Doe"
    },};

public ObservableCollection<TestItemDto> TestItemSource
{
    get => _testItemSource;
    set
    {
        _testItemSource = value;
    }
}


private string _testText;

public string TestText
{
    get { return _testText; }
    set
    {
        _testText = value;
        Console.WriteLine($"TestText:{TestText}");
    }
}

private TestItemDto _testSelectedItem;

public TestItemDto TestSelectedItem
{
    get { return _testSelectedItem; }
    set
    {
        _testSelectedItem = value;
        Console.WriteLine($"TestText:{TestSelectedItem?.Id}:{TestSelectedItem?.Text}");
    }
}

转换器:

public class AutocompleteItemTextConverter : IValueConverter
{
    public object Convert(object value,Type targettype,object parameter,CultureInfo culture)
    {
        var adresarSearchResultItemDto = value as TestItemDto;
        return adresarSearchResultItemDto?.Text;
    }
    public object ConvertBack(object value,CultureInfo culture)
    {
        return null;
    }
}

解决方法

问题在于 TryGetMatch 方法搜索匹配文本,然后选择第一个匹配项。

我添加了一个 priorityView 参数(其中传递了 SelectedItem)。因此,在搜索 ItemSource 的其余部分之前 - 首先检查当前 SelectedItem 是否已经与文本匹配:

private object TryGetMatch(string searchText,object priorityView,ObservableCollection<object> view,AutoCompleteFilterPredicate<string> predicate)
{
    if (priorityView != null)
    {
        if (predicate(searchText,FormatValue(priorityView)))
        {
            return priorityView;
        }
    }
    
    if (view != null && view.Count > 0)
    {
        foreach (object o in view)
        {
            if (predicate(searchText,FormatValue(o)))
            {
                return o;
            }
        }
    }

    return null;
}

这也merged进入了原始存储库

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?