我对异步方法很陌生,并且为这种情况而挣扎(我用一个简单的例子说明了我的问题):
假设我有一个ComboBox,哪些项与*BindableCollection NameList *绑定,哪些项是一些名称。
<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看起来如下所示:
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;
}并充当组合框中类型短语的搜索函数。问题是,我希望异步地进行过滤,但是每当我尝试这样做时,我都会得到一个错误:调用线程无法访问这个对象,因为另一个线程拥有它。
请给我一些建议,该怎么做。所有示例代码:
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;
}
}发布于 2022-09-22 06:32:46
问题是,我希望异步地进行过滤,但是每当我尝试这样做时,我就会得到一个错误:调用线程无法访问这个对象,因为另一个线程拥有它。
如果要从后台线程更新UI,则应在Application的dispatcher中运行代码
Application.Current.Dispatcher.Invoke(() => /* modify combobox here */);https://stackoverflow.com/questions/73810052
复制相似问题