在异步接收数据之前查看加载

时间:2016-10-28 08:14:47

标签: c# wpf task-parallel-library

以下是我的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被填充。请帮助如何实现这一目标。

1 个答案:

答案 0 :(得分:3)

您不应该在构造函数中加载数据。它违反了SOL的S原则。

您应该使用Command链接到Loaded事件或类似事件来加载数据。

您也不应该使用async void方法签名,因为它会隐藏方法抛出的Exception

您的构造函数正在立即返回,因为您没有调用await GetProductsList()。您的代码导致在构造函数完成后执行异步方法。

要解决您的可见性问题,请在BooleanToVisibilityConverterBinding属性上使用IsDataLoaded,并在更改值时通知它。