我有一个包含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);
}
}
答案 0 :(得分:1)
您的 Product 类应实现 INotifyPropertyChanged 。
然后无需在GetRank()方法中调用NotifyPropertyChanged。