在异步接收数据之前加载视图

本文关键字:加载 视图 数据 异步 | 更新日期: 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方法在构造函数完成后执行。

要解决您的可见性问题,不如在BindingIsDataLoaded属性上使用BooleanToVisibilityConverter,并使其在更改值时通知。