以下是我的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被填充。请帮助如何实现这一目标。
答案 0 :(得分:3)
您不应该在构造函数中加载数据。它违反了SOL的S原则。
您应该使用Command
链接到Loaded
事件或类似事件来加载数据。
您也不应该使用async void
方法签名,因为它会隐藏方法抛出的Exception
。
您的构造函数正在立即返回,因为您没有调用await GetProductsList()
。您的代码导致在构造函数完成后执行异步方法。
要解决您的可见性问题,请在BooleanToVisibilityConverter
到Binding
属性上使用IsDataLoaded
,并在更改值时通知它。