使用异步任务通知属性更新

时间:2018-07-20 14:20:43

标签: c# wpf asynchronous task

我有一个包含ListView的View,在其中加载了ObservableCollection。

之后,我将从我的MySQL数据库foreach项中收集一些外部数据。

我想在异步任务中执行这些操作以防止ui冻结。

对于所有在ListView中不可见的项目,更新工作正常。因为它们是虚拟的?

当前在ListView上可见的项目未更新。如何通知视图以更新项目的属性?

注意:Viewmodel通过BaseViewModel实现InotifyPropertiChanged

public class ProductViewModel : BaseTypes.BaseViewModel
{
    public ProductViewModel()
    {
    }

    public void GetProducts(string filter)
    {
        if (filter.Equals(""))
        {
            return;
        }
        Products.Clear();

        Product product = new Product();
        product.GetProductsByHersteller(filter);
        if (product.productsList != null)
        {
            product.productsList.ToList().ForEach(Products.Add);
        }
        GetRanking();
    }

    private ObservableCollection<Product> _Products = new ObservableCollection<Product>();
    public ObservableCollection<Product> Products { get { return _Products; } private set { _Products = value; } }

    async Task GetRanking()
    {
        await Task.Run(() => GetRank());
    }

    private void GetRank()
    {
        foreach (Product item in Products)
        {
            item.Rank.Get(item.Asin);
            NotifyPropertyChanged(nameof(Products));
        }
    }
}

产品类别中的属性

    private Produkt.Ranking rank = new Produkt.Ranking();
    public Produkt.Ranking Rank { get => rank; set => rank = value; }

解决方案:

将INotifyPropertyChanged添加到排名类。

ViewModel中的代码现在是这样:

public void GetProducts(string filter)
{
    if (filter.Equals(""))
    {
        return;
    }
    Products.Clear();

    Product product = new Product();
    product.GetProductsByHersteller(filter);
    if (product.productsList != null)
    {
        product.productsList.ToList().ForEach(Products.Add);
    }
    GetRanking();
}

private ObservableCollection<Product> _Products = new ObservableCollection<Product>();
public ObservableCollection<Product> Products { get { return _Products; } private set { _Products = value; } }

    async void GetRanking()
    {
        await Task.Run(() => GetRank());
    }

    private void GetRank()
    {
        foreach (Product item in Products)
        {
            item.Rank.Get(item.Asin);
        }
    }

1 个答案:

答案 0 :(得分:1)

您的 Product 类应实现 INotifyPropertyChanged

然后无需在GetRank()方法中调用NotifyPropertyChanged。