2016-07-18 22 views
1

Ich verwende Xamarin und MVVMCross, um eine IOS-App zu implementieren. Eine Ansicht, an der ich gerade arbeite, wird korrekt angezeigt, aber NUR, wenn ich die Daten in meinem ViewModel festdecodiere und NICHT, wenn meine Daten (wie geplant und notwendig) spät von SQLite eintreffen, nur eine unbestimmte Zeit nach der Ansicht wird gezeigt.Wie kann ich UICollectionView neu zeichnen, wenn sich die Daten von MvxCollectionViewSource ändern?

Was ich benutze und bisher erreicht:

  • Arbeiten/Zeigen Storyboard für meine Ansicht, die eine UICollectionView hat innen (genannt: Collection in Code unten)
  • Benutzerdefinierte Layout und XIB-Datei für jede UICollectionViewCell die auch korrekt in meiner Ansicht angezeigt wird
  • Eine Ansicht, die nur funktioniert, wenn ViewModel da ta ist voll besetzt der Moment ViewDidLoad() heißt.

Problem:

  • Meine Daten in meinem Ansichtsmodell wird von den Datenbanken des Modells aktualisiert in einer ungewissen Höhe der Zeit, während der Blick glücklich gezeigt wird. Wenn ich die Daten wie unten gezeigt binde (und Zweiwege-/Einwegbindungen und ähnliches versuche), erhalte ich keine Aktualisierungen in meiner Ansicht, da die Enddaten später eintreffen.

Was ich kann nicht scheinen zu tun:

  • neuzeichnen die UICollectionView oder vielleicht aktualisieren Sie die MvxCollectionViewSource unten, der als Datenänderungen des Ansichtsmodell zu gewährleisten, kann ich neu zeichnen tatsächlich die UICollectionView und zeigen Sie meine benutzerdefinierte Zellen mit neuen und aktualisierten Daten.

Code (TM)

Die Collection Zellen implementiert sind wie folgt. Ich habe alle Beispiele online und von diesem Stuart Bloke und seine Kätzchen um sicherzustellen, dass ich alle Muster implementieren genau das gleiche:

[Register("MyCell")] 
public partial class MyCell : MvxCollectionViewCell 
{ 
    public static readonly UINib Nib = UINib.FromName("MyCell", NSBundle.MainBundle); 
    public static readonly NSString Key = new NSString("MyCell"); 

    public MyCell(IntPtr handle) : base(handle) 
    { 
     this.DelayBind(() => { 
      var set = this.CreateBindingSet<MyCell, SomeModelClass>(); 
      set.Bind(Label1).To(item => item.Label1); 
      set.Bind(Label2).To(item => item.Label2); 
      set.Apply(); 
     }); 
    } 

    public static MyCell Create() 
    { 
     return (MyCell)Nib.Instantiate(null, null)[0]; 
    } 
} 

Mein ViewDidLoad() in der Ansicht etwa wie folgt aussieht:

CollectionView.RegisterNibForCell(MyCell.Nib, MyCell.Key); 
var source = new MvxCollectionViewSource(CollectionView, MyCell.Key); 
CollectionView.Source = source; 

var set = this.CreateBindingSet<MyView, MyViewModel>(); 
set.Bind(source).To(vm => vm.ListOfStuff); 
set.Apply(); 

CollectionView.ReloadData(); 

Achtung! Die oben gezeigte ListOfStuff ist wirklich nur eine Liste einer benutzerdefinierten Klasse mit 2 Strings.

TL: DR: Ich weiß nicht, ListOfStuff ‚s Werte der Moment, als ich den obigen Code nennen. Wenn ich sie im ViewModel festcode, bekomme ich Freude. Wenn nicht, dann nicht, auch wenn die Daten später korrekt aktualisiert werden.

erreiche ich jetzt zu euch heraus, die Neuronen des Gehirns von Crowdsourcing ...

+0

Es scheint zu funktionieren: – user757410

+0

source.ReloadOnAllItemsSourceSets = true; genannt !!! Ich rief es auch früher und es hat nicht funktioniert, aber ich denke, meine Zellengrößen waren dann falsch und diese Dinge können einfach nichts ohne Fehler und dergleichen zu rendern. – user757410

Antwort

0

Statt eine List<T> Verwendung ObservableCollection<T> und neue Elemente hinzugefügt, um die CollectionView der Verwendung werden sollte.

Die Benutzeroberfläche muss wissen, wann sich die Sammlung geändert hat. ObservableCollection<T> implementiert INotifyCollectionChanged und INotifyPropertyChanged und kommuniziert mit der Benutzeroberfläche, wenn sich die Sammlung ändert.

Sie sollten ReloadData() nicht mehr benötigen, wenn Sie ObservableCollection<T> verwenden.

könnte Diese Erweiterung Methode von Nutzen sein, wenn die Reichweite der Zugabe IEnumerable<T>

public static class ObservableCollectionExtensionMethod 
{ 
    public static void AddRange<TSource>(this ObservableCollection<TSource> source, IEnumerable<TSource> collection) 
    { 
     foreach (var i in collection) source.Add(i); 
    } 
} 
+0

Vielen Dank für die Antwort, Pilatus! Ich werde es versuchen :) – user757410