我有ComboBox
如下:
ComboBox IsEditable="True"
Width="200"
Height="25"
IsTextSearchEnabled="False"
x:Name="cb"
PreviewTextInput="Cb_OnPreviewTextInput"
ItemsSource="{Binding ItemList}"
Text="{Binding SearchTextText}">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
调用Cb_OnPreviewTextInput
时,我设置了IsDropdownOpen = true
。
在第一次尝试时(键入第一个字母后),列表中的第一个项目被选中,我可以使用相关箭头上下移动,插入符号仍然在TextBox
。
当我继续打字的时候,我不能再上下导航(当时只有1个项目),此时整个ScrollViewer会得到焦点,我只能到底或者到顶部,但不是1比1.我必须关闭弹出窗口,例如按Escape,然后输入1个字符重新打开,以便能够再次上/下。
我也注意到在按下PageUp之后第一个项目也被选中了,所以我试图在代码中模仿它,但没有运气。
任何人都知道该怎么做才能上下滑动并输入没有问题?
答案 0 :(得分:0)
当我试图在孤立的环境中重现你的问题时,一切都很好......
您使用的是哪个.NET版本?
我使用过这样的代码:
<Window x:Class="InterviewApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow"
Height="350"
Width="525"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<WrapPanel Orientation="Horizontal">
<ComboBox IsEditable="True"
Width="200"
Height="25"
IsTextSearchEnabled="False"
x:Name="cb"
PreviewTextInput="Cb_OnPreviewTextInput"
ItemsSource="{Binding ItemList}"
Text="{Binding SearchTextText}">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
</WrapPanel>
</Window>
和背后的代码看起来像这样
namespace Application
{
public partial class MainWindow : INotifyPropertyChanged
{
public MainWindow()
{
ItemList = new ObservableCollection<string>();
for (var i = 0; i < 1000; i++)
{
ItemList.Add($"Item {i}");
}
InitializeComponent();
}
private void Cb_OnPreviewTextInput(object sender, TextCompositionEventArgs e)
{
cb.IsDropDownOpen = true;
}
public ObservableCollection<string> ItemList { get; set; }
public string SearchTextText
{
get => _searchTextText;
set
{
if (_searchTextText == value) return;
_searchTextText = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SearchTextText)));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
答案 1 :(得分:0)
Jordi 在此处提供了创建过滤组合框的最佳答案:Dynamic filter of WPF combobox based on text input 如果你这样做,你可以在xaml中实现:
<local:FilterableComboBox Width="250" Height="25" ItemsSource="{Binding ItemList}" SelectedItem="{Binding SelectedItem}" OnlyValuesInList="True"/>