2017-06-15 6 views
0

Ich habe eine ListView, die Bilder enthält, die Bilder werden von einem Server abgerufen. Der erste API-Aufruf, den ich mache, erhält die Daten in var people. Ich lade die Listenansicht mit einem Platzhalterbild und führe dann den zweiten API-Aufruf aus, um die Bilder für jedes Element in der Listenansicht zu erhalten. Ich erhalte ein Byte [] als Bild und wandle es in eine ImageSource um. Ich habe eine Suchschaltfläche am oberen Rand der Seite, die ich verbindlich an TempImage festlegte, die das Byte [] als seine Quelle verwendet, und es ändert sich zu den Bildern, die geladen werden. Die Konvertierung von Byte [] in ImageSource ist also in Ordnung. Die Anfangseinstellung von p.PictureImageSource = "name_circle.png" funktioniert auch korrekt. Die Einstellung von p.PictureImageSource auf das konvertierte Byte [] funktioniert jedoch NICHT. Es ändert sich nie von der ursprünglichen "name_circle.png". Irgendwelche Ideen?Xamarin ImageSource in ListView nicht aktualisiert

     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

Wie sieht Ihr 'PersonViewModel' aus? – apineda

+0

Es handelt sich um eine öffentliche Klasse mit den Attributen 'öffentliche Zeichenfolge E-Mail', 'öffentliches Byte [] Bild' und 'öffentliche ImageSource PictureImageSource'. –

+0

Implementiert 'PersonViewModel'' INotifyPropertyChanged'? –

Antwort

0

Apineda war richtig in der Annahme, die Listenansicht wurde nicht mit den neuen Daten zu aktualisieren. Ich habe die zwei API-Aufrufe in zwei verschiedene Methoden getrennt (nicht sicher, ob dieser Teil völlig notwendig ist). Nach dem Abschluss des zweiten Anrufs setze ich die Listenansicht ItemSource auf Null und dann zurück auf den Wert Results, wodurch eine Aktualisierung erzwungen wird. Jetzt zeigen die Bilder.

searchGestureRecognizer.Tapped += async (s, e) => { 
       await _viewModel.GetResults(); 
       await _viewModel.GetImagesForResults(); 
       resultsListView.ItemsSource = null; 
       resultsListView.ItemsSource = _viewModel.Results; 
      }; 
Verwandte Themen