如果项目不在下拉列表中,则在 Wpf ComboBox 中键入会很慢
Typing in Wpf ComboBox is behaving slow if the items are not in dropdown
我有一个组合框,其项目列表为 53k,底层项目源作为 collectionview。它是一个使用 sqlite 作为数据库的离线应用程序。 Combobox 非常高效地填充了所有 53k 项,但是如果我键入任何不在下拉列表中的内容,键入速度会变慢。
<ComboBox IsEditable="True" HorizontalAlignment="Stretch"
ItemsSource="{Binding Path=Items,Source={StaticResource PurchaseViewModel},Mode=TwoWay}"
DisplayMemberPath="[item_name]"
IsTextSearchCaseSensitive="False"
TextSearch.TextPath="[item_name]"
SelectedItem="{Binding Path=PurchaseItem,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,Converter={StaticResource DataRowConverter}}"
IsSynchronizedWithCurrentItem="false">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
我已经在 ViewModel 中定义了属性。
public class PurchaseViewModel : INotifyPropertyChanged
{
private CollectionView _Items;
public CollectionView Items
{
get
{
return _Items;
}
set
{
_Items = value;
OnPropertyChanged("Items");
}
}
public PurchaseViewModel()
{
Task.Run(() => GetItems());
}
public async Task GetItems()
{
DataView d = await ItemsService.GetAllItems();
Items = CollectionViewSource.GetDefaultView(d) as CollectionView;
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
我创建了一个转换器来将组合框的选定项从数据行视图转换为自定义项对象
class DataRowConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is DataRowView && value != null)
{
DataRowView dataRowView = value as DataRowView;
return dataRowView[1];
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is DataRowView && value != null)
{
DataRowView dataRowView = value as DataRowView;
Item item = new Item();
item.ItemId = int.Parse(dataRowView[0].ToString());
item.Name = dataRowView[1].ToString();
return item;
}
return value;
}
}
一切正常,但问题是,如果搜索项不在 ComboxItems 列表中,则 ComboxBox 键盘键入变得非常缓慢,就像我按一个键一样,它会在几秒钟后显示。
这里是否有任何 WPF 大师可以挽救我的工作并建议我修复或替代解决这个问题,如果搜索词不是 list.i 尝试单独过滤集合视图,如何提高组合框的键入速度线程但它给出了错误。谢谢
您必须使用虚拟化数据方法。我将这篇文章用作虚拟化 collection 的示例。 https://www.codeproject.com/Articles/34405/WPF-Data-Virtualization
我有一个组合框,其项目列表为 53k,底层项目源作为 collectionview。它是一个使用 sqlite 作为数据库的离线应用程序。 Combobox 非常高效地填充了所有 53k 项,但是如果我键入任何不在下拉列表中的内容,键入速度会变慢。
<ComboBox IsEditable="True" HorizontalAlignment="Stretch"
ItemsSource="{Binding Path=Items,Source={StaticResource PurchaseViewModel},Mode=TwoWay}"
DisplayMemberPath="[item_name]"
IsTextSearchCaseSensitive="False"
TextSearch.TextPath="[item_name]"
SelectedItem="{Binding Path=PurchaseItem,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,Converter={StaticResource DataRowConverter}}"
IsSynchronizedWithCurrentItem="false">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
我已经在 ViewModel 中定义了属性。
public class PurchaseViewModel : INotifyPropertyChanged
{
private CollectionView _Items;
public CollectionView Items
{
get
{
return _Items;
}
set
{
_Items = value;
OnPropertyChanged("Items");
}
}
public PurchaseViewModel()
{
Task.Run(() => GetItems());
}
public async Task GetItems()
{
DataView d = await ItemsService.GetAllItems();
Items = CollectionViewSource.GetDefaultView(d) as CollectionView;
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
我创建了一个转换器来将组合框的选定项从数据行视图转换为自定义项对象
class DataRowConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is DataRowView && value != null)
{
DataRowView dataRowView = value as DataRowView;
return dataRowView[1];
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is DataRowView && value != null)
{
DataRowView dataRowView = value as DataRowView;
Item item = new Item();
item.ItemId = int.Parse(dataRowView[0].ToString());
item.Name = dataRowView[1].ToString();
return item;
}
return value;
}
}
一切正常,但问题是,如果搜索项不在 ComboxItems 列表中,则 ComboxBox 键盘键入变得非常缓慢,就像我按一个键一样,它会在几秒钟后显示。 这里是否有任何 WPF 大师可以挽救我的工作并建议我修复或替代解决这个问题,如果搜索词不是 list.i 尝试单独过滤集合视图,如何提高组合框的键入速度线程但它给出了错误。谢谢
您必须使用虚拟化数据方法。我将这篇文章用作虚拟化 collection 的示例。 https://www.codeproject.com/Articles/34405/WPF-Data-Virtualization