如何解决AutoCompleteBox - 如何从匹配项目的集合中选择特定项目?
使用 autocompletebox 时 - 我有一个具有匹配显示文本的项目列表 - 但 ID 值不同。
[{Text:"John",Id:1},{Text:"John",Id:2},{Text:"John Doe",Id:3}]
当我选择第二行 (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 举报,一经查实,本站将立刻删除。