在异步接收数据之前加载视图
本文关键字:加载 视图 数据 异步 | 更新日期: 2023-09-27 18:15:18
以下是我的ViewModel类:
public partial class DosAdminProductHierarchy : UserControl, INotifyPropertyChanged
{
public DosAdminProductHierarchy()
{
InitializeComponent();
this.GetProductList();
//this.ProductList = new NotifyTaskCompletion<List<Product>>(this.GetProductList());
OnPropertyChanged("DepartmentList");
if(isDataLoaded)
{
treeList.ItemsSource = ProductList;
treeList.Visibility = Visibility.Visible;
}
}
private ObservableCollection<Product> dbProductList;
private bool isDataLoaded = false;
public ObservableCollection<Product> ProductList
{
get
{
return dbProductList;
}
private set
{
dbProductList = value;
isDataLoaded = true;
}
}
private async void GetProductList()
{
try
{
IWebApiDataAdapter _webAPIDataAdapter = new DosAdminDataAdapter();
List<Product> lstProd= new List<Product>();
lstProd = await _webAPIDataAdapter.GetProductHierarchy();
dbProductList = new ObservableCollection<Product>();
foreach (Product prd in lstProd)
{
dbProductList.Add(prd);
}
}
catch (Exception ex)
{
throw (ex);
}
}
}
我的问题是我想要ProductList被填充,但它没有被填充。即使数据没有从WebApi返回,执行仍然到达构造函数的末尾,我想以某种方式保持执行或向用户显示某些东西正在忙,直到ProductList被填充。
不应该在构造函数中加载数据。它违背了SOLID的S原则。
您应该使用链接到Loaded
事件的Command
或类似于加载数据。
您也不应该使用async void
方法签名,因为它隐藏了由该方法抛出的Exception
。
构造函数立即返回,因为没有调用await GetProductsList()
。你的代码导致async方法在构造函数完成后执行。
要解决您的可见性问题,不如在Binding
到IsDataLoaded
属性上使用BooleanToVisibilityConverter
,并使其在更改值时通知。