2014-11-25 20 views
7

Problem: Änderungen Daten aber Listview nicht aktualisiertXamarin.Forms - Listview nicht aktualisiert, wenn Daten verändert

Ich habe eine Listview Itemssource dessen wird auf

<ListView ItemsSource="{Binding ContactsGrouped}" 

Auf einen Klick Ich aktualisiere die Abfrage, um nur Datensätze zurückzugeben, die die Buchstaben "Je" enthalten. Ich kann sehen, dass das Richtige zurückgegeben wird und dass ContactsGrouped aktualisiert wird, aber die Benutzeroberfläche sich nicht ändert.

public ObservableCollection<Grouping<string, Contact>> ContactsGrouped { get; set; } 

wo Gruppierung sieht wie folgt aus:

public class Grouping<K, T> : ObservableCollection<T> 
{ 
    public K Key { get; private set; } 

    public Grouping (K key, IEnumerable<T> items) 
    { 
     Key = key; 
     foreach (var item in items) 
      this.Items.Add(item); 
    } 
} 

Da ich ObservableCollections bin mit, ich die Liste erwarten würde neu zu zeichnen. Fehle ich etwas Offensichtliches?

Antwort

1

Es stellt sich heraus, dass beim Implementieren von INotifyPropertyChanged die Liste immer noch nicht aktualisiert wird, wenn sie gefiltert wird. Wenn Sie jedoch den Code ausschließen, der die Liste in der VM auffüllt und diesen Code anschließend in der OnTextChanged-Methode aufruft (gefolgt von einem Aufruf zum Zurücksetzen der ItemsSource), ist das der Fall.

public void OnTextChanged (object sender, TextChangedEventArgs e) { 
     vm.PopulateContacts(vm.CurrentDataService); 
     ContactListView.ItemsSource = vm.ContactsGrouped; 
    } 

Die PopulateContacts Methode sieht wie folgt aus (verkürzt) ...

// setup 
    // Get the data 
     var sorted = 
      from contact in contacts 
      orderby contact.FullName 
      group contact by contact.FirstInitial 
      into contactGroup 
      select new Grouping<string, Contact> (contactGroup.Key, contactGroup); 

     contactsGrouped = new ObservableCollection<Grouping<string, Contact>> (sorted); 

, das funktioniert, und ist recht sauber und prüfbar

1

Ich nehme an, die Gruppierungsklasse wird von einem ViewModel verwendet. In dem Fall, dass die Ansichtsmodell INotifyPropertyChanged Schnittstelle wie unten zu implementieren hat:

#region INotifyPropertyChanged implementation 

public event PropertyChangedEventHandler PropertyChanged; 

public void OnPropertyChanged ([CallerMemberName]string propertyName = null) 
{ 
    if (PropertyChanged != null) { 
     PropertyChanged (this, new PropertyChangedEventArgs (propertyName)); 
    } 
} 

#endregion 

Solange Sie die Eigenschaft auf die Einstellung der OnPropertyChnaged Methode aufrufen, dann werden Sie die Ergebnisse der Bindung erhalten.

Verwandte Themen