2017-06-15 13 views
0

イメージを含むListViewがあり、イメージがサーバーからフェッチされます。私が作る最初のAPI呼び出しは、var peopleのデータを取得します。私は、プレースホルダ画像でリストビューを読み込み、2番目のAPI呼び出しを実行して、リストビュー内の各項目の画像を取得します。私は画像としてbyte []を受け取り、それをImageSourceに変換します。私は、ページの上部にある検索ボタンを持って、TempImageへのバインディングを設定し、バイト[]をソースとして使用し、ロードされたイメージに変更します。 byte []のImageSourceへの変換は問題ありません。 p.PictureImageSource = "name_circle.png"の初期設定も正しく動作します。ただし、変換されたbyte []に​​p.PictureImageSourceを設定しても機能しません。それは最初の"name_circle.png"から変わることはありません。何か案は?リストビュー内のXamarin ImageSourceは更新されません。

     var people = peopleModel.Response; 

         if(people.Count == 0) 
         { 
          ShowNoResults = true; 
         } 
         else 
         { 
          ShowNoResults = false; 
          Results = peopleModel.Response; 
          foreach (PersonViewModel p in Results) 
          { 
           p.Initials = p.FirstName[0].ToString() + p.LastName[0]; 
           p.PictureImageSource = "name_circle.png"; 
          } 

         } 

         //must do 2 seperate loops so the initials load before going on with 2nd search 
         foreach (PersonViewModel p in Results) 
         { 
          IsBusy = false; 
          var peopleImage = await peopleService.GetPersonImage("p.Email"); 

          if ((peopleImage.Error == null) && (peopleImage.Response != null)) 
          { 
           p.Picture = peopleImage.Response; 

           byte[] imageAsBytes = (byte[])peopleImage.Response; 
           p.PictureImageSource = ImageSource.FromStream(() => new MemoryStream(imageAsBytes)); 
           TempImage = ImageSource.FromStream(() => new MemoryStream(imageAsBytes)); 
          } 

         } 

         OnPropertyChanged(); 

-

public class PersonViewModel : INotifyPropertyChanged 
    { 
     public WorkstationViewModel WorkstationDetail { get; set; } 

     public List<PointViewModel> Points { get; set; } 

     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string FullName { get; set; } 
     public string Initials { get; set; } 
     public string Email { get; set; } 
     public string ID { get; set; } 
     public string Department { get; set; } 
     public string BuildingName { get; set; } 
     public string SiteID { get; set; } 
     public string BuildingID { get; set; } 
     public string FloorNumber { get; set; } 
     public string FloorID { get; set; } 
     public string Workstation { get; set; } 
     public string Title { get; set; } 
     public string Phone { get; set; } 
     public byte[] Picture { get; set; } 
     public ImageSource PictureImageSource { get; set; } 

     public event PropertyChangedEventHandler PropertyChanged; 
    } 
+0

あなたの 'PersonViewModel'はどのように見えますか? – apineda

+0

これは 'public string Email'、' public byte [] Picture'、 'public ImageSource PictureImageSource'の属性を持つパブリッククラスです。 –

+0

'PersonViewModel'は' INotifyPropertyChanged'を実装していますか? –

答えて

0

Apinedaは、リストビューは、新しいデータで全くリフレッシュしていなかった思考で正しかったです。私は2つのAPI呼び出しを2つの異なるメソッドに分けました(この部分が完全に必要かどうかはわかりません)。 2回目の呼び出しが完了した後、リストビューのItemSourceをヌルに設定してからResults値に戻して、強制的にリフレッシュを行いました。今すぐ画像が表示されます。

searchGestureRecognizer.Tapped += async (s, e) => { 
       await _viewModel.GetResults(); 
       await _viewModel.GetImagesForResults(); 
       resultsListView.ItemsSource = null; 
       resultsListView.ItemsSource = _viewModel.Results; 
      }; 
関連する問題