2016-10-28 26 views
0

続いて受信される前に、ビューがロードされてばかりは私の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

クライアントに何かを示すプログレスバーを使用します。 –

+0

私はそれをやろうとしましたが、始めから100%になっています。私はスレッドを制御することができません。 –

+0

'GetProduct'メソッドが' async'を呼び出すこのことを試してみてください。 [ProgressBar](http://www.wpf-tutorial.com/misc-controls/the-progressbar-control/)、[Async](https://msdn.microsoft.com/en-us/library/mt674882) aspx) –

答えて

3

コンストラクタにデータを読み込まないでください。それはSOLIDのS原則に違反します。

データをロードするにはLoadedイベントにリンクされたCommandを使用する必要があります。

また、がメソッドによってスローされるので、async voidメソッドシグネチャを使用しないでください。

await GetProductsList()を呼び出さないため、コンストラクタがすぐに戻ります。あなたのコードは、コンストラクタが完了した後にasyncメソッドが実行される結果となります。

可視性に関する問題を解決するには、BindingからIsDataLoadedプロパティでBooleanToVisibilityConverterを使用し、値が変更されたときに通知するようにします。

+0

私はここでNotifyTaskCompletionを使用していた可能性がありますが、後で私はいくつかの処理を行うリストを列挙しているので、使用できませんでした。 –