首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步ComboBox过滤

异步ComboBox过滤
EN

Stack Overflow用户
提问于 2022-09-22 06:11:04
回答 1查看 36关注 0票数 0

我对异步方法很陌生,并且为这种情况而挣扎(我用一个简单的例子说明了我的问题):

假设我有一个ComboBox,哪些项与*BindableCollection NameList *绑定,哪些项是一些名称。

代码语言:javascript
复制
            <ComboBox
                x:Name="SubbranchComboBox"
                Margin="20 0 0 0"
                Width="100"
                Height="20"
                IsEnabled="True"
                IsEditable="True"
                IsTextSearchEnabled="False"
                InputScope="Xml"
                ItemsSource="{Binding NameList}" KeyUp="ComboBox_KeyUp">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}" />
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>

ComboBox_KeyUp看起来如下所示:

代码语言:javascript
复制
        private void ComboBox_KeyUp(object sender, KeyEventArgs e)
    {
        var combobox = (ComboBox)sender;
        var ctb = combobox.Template.FindName("PART_EditableTextBox", combobox) as TextBox;
        if (ctb == null) return;
        if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift) || Keyboard.Modifiers.HasFlag(ModifierKeys.Control) || Keyboard.Modifiers.HasFlag(ModifierKeys.Alt))
            return;
        var caretPos = ctb.CaretIndex;
        var searchedText = combobox.Text.ToLower();
        combobox.SelectedIndex = -1;
        combobox.IsDropDownOpen = true;

        CollectionView itemsViewOriginal = (CollectionView)CollectionViewSource.GetDefaultView(combobox.Items);
        itemsViewOriginal.Filter = ((o) =>
        {
            if (String.IsNullOrEmpty(searchedText))
            {
                return true;
            }
            else
            {
                if (((string)o).ToLower().Contains(searchedText.ToLower()))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        });
        itemsViewOriginal.Refresh();
        ctb.CaretIndex = caretPos;
    }

并充当组合框中类型短语的搜索函数。问题是,我希望异步地进行过滤,但是每当我尝试这样做时,我都会得到一个错误:调用线程无法访问这个对象,因为另一个线程拥有它

请给我一些建议,该怎么做。所有示例代码:

代码语言:javascript
复制
    public partial class MainWindow : Window
{
    public BindableCollection<String> NameList { get; set; }
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        NameList = new BindableCollection<String>
            {
                "Tony",
                "Jerry",
                "George",
                "Harry",
                "Snape",
                "Sirius",
                "Dan",
                "Michael",
                "Mike",
                "Sebastian",
                "Simon",
                "Johny"
            };
    }

    private void ComboBox_KeyUp(object sender, KeyEventArgs e)
    {
        var combobox = (ComboBox)sender;
        var ctb = combobox.Template.FindName("PART_EditableTextBox", combobox) as TextBox;
        if (ctb == null) return;
        if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift) || Keyboard.Modifiers.HasFlag(ModifierKeys.Control) || Keyboard.Modifiers.HasFlag(ModifierKeys.Alt))
            return;
        var caretPos = ctb.CaretIndex;
        var searchedText = combobox.Text.ToLower();
        combobox.SelectedIndex = -1;
        combobox.IsDropDownOpen = true;

        CollectionView itemsViewOriginal = (CollectionView)CollectionViewSource.GetDefaultView(combobox.Items);
        itemsViewOriginal.Filter = ((o) =>
        {
            if (String.IsNullOrEmpty(searchedText))
            {
                return true;
            }
            else
            {
                if (((string)o).ToLower().Contains(searchedText.ToLower()))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        });
        itemsViewOriginal.Refresh();
        ctb.CaretIndex = caretPos;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-09-22 06:32:46

问题是,我希望异步地进行过滤,但是每当我尝试这样做时,我就会得到一个错误:调用线程无法访问这个对象,因为另一个线程拥有它。

如果要从后台线程更新UI,则应在Application的dispatcher中运行代码

代码语言:javascript
复制
Application.Current.Dispatcher.Invoke(() => /* modify combobox here */);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73810052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档