gpt4 book ai didi

c# - WPF 使用异步方法更新 ListBox 中的项目源

转载 作者:行者123 更新时间:2023-11-30 22:01:52 25 4
gpt4 key购买 nike

我有一个 ListBox 并想将其 ItemsSource 设置为我从云中获取的 ObservableCollection。我必须等待这个传入的集合,它导致我的 itemssource 无法更新。

这是我的方法。这是我的 xaml.cs 构造函数:

{
InitializeComponent();
GetEmployeeList();
}

及其调用的方法:

private async void GetEmployeeList()
{
await EmployeeController.GetAllEmployees().ContinueWith(r =>
{
_employees = (r.Result);
EmployeeListBox.ItemsSource = _employees;
});
}

我的 EmployeeController.GetAllEmployees() 返回一个 ObservableCollection。和 _employees 得到更新,但是我的 EmployeeListBox 不显示这些对象。我已经尝试使用静态硬编码集合并且它工作正常 - 这是由于我的异步吗?有人有建议吗?

-谢谢。

最佳答案

假设您确定正在调用 continueWith,您的 continueWith 代码块很可能发生在非 UI 线程上。

一个选项是为延续设置 CurrentSyncronizationContext(下面的示例)。这要求继续代码在与原始任务启动的线程相同的线程上执行。或者,您需要调用 UI 线程上的代码,最常见的是使用 Dispatcher。

private async void GetEmployeeList()
{
await EmployeeController.GetAllEmployees().ContinueWith(r =>
{
_employees = (r.Result);
EmployeeListBox.ItemsSource = _employees;
},
TaskScheduler.FromCurrentSynchronizationContext());
}

但是,由于您正在使用 await - 并且它是从 UI 线程调用的,因此您也可以将 await 的结果直接设置为 ItemSource:

private async void GetEmployeeList()
{
EmployeeListBox.ItemsSource = await EmployeeController.GetAllEmployees();
}

...这也很好地展示了 async/await 关键字为您节省了多少代码:)

关于c# - WPF 使用异步方法更新 ListBox 中的项目源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27376887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com