目录
如何使用 WPF 中的任务正确刷新网格中的数据
c#wpfdata-bindingdevexpresstask
浏览量:854
编辑于:2023-04-12 23:02:37

我的小 WPF 代码给了我这个错误调用线程无法访问此对象,因为其他线程拥有它 我知道它到底在说什么,但我无法理解如何解决它。我尝试过不同的东西,但没有运气,我承认我在任务库中并不擅长。

这就是我正在努力实现的目标。

  1. 加载 WPF 表单时加载数据 - 这没关系
  2. 在表单上,用户将按**“刷新”**按钮以刷新数据库中的数据。

这是我的代码

public partial class DocListView : UserControlListBase
{
    private ScecoBillDataScope _scecoBillDataScope;
    public EntityCollection<ScecoBillEntity> ScecoBills = new EntityCollection<ScecoBillEntity>();

   public DocListView()
    {
        InitializeComponent();
        LoadData();
    }


   private async void LoadData()
    {
        await Task.Run(() =>
        {

            _scecoBillDataScope.FetchData();
        });
        var collectionView = CollectionViewSource.GetDefaultView(_scecoBillDataScope.ScecoBills);

        await Dispatcher.BeginInvoke(new ThreadStart(()=> LayoutRoot.DataContext = collectionView));

     }

  private void BbiRefresh_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
    {
        _scecoBillDataScope.Reset();
        LoadData();
        e.Handled = true;
    }}

实际上,当我单击此行的“刷新”按钮时会出现错误**_scecoBillDataScope.FetchData();**请指教。

解决方案:

Your problem is this line:

await Dispatcher.BeginInvoke(new ThreadStart(()=> LayoutRoot.DataContext = collectionView));

You're just creating a new thread, you have to actually dispatch on the GUI thread:

Application.Current.Dispatcher.Invoke(() =>
{
    LayoutRoot.DataContext = collectionView;
});