2014-11-25 25 views
7

Problem: zmiany danych, ale ListView nie aktualizujeXamarin.Forms - ListView nie aktualizuje gdy dane zmienia

Mam ListView, którego ItemsSource jest ustawiony na

<ListView ItemsSource="{Binding ContactsGrouped}" 

Na kliknięciem Aktualizuję zapytanie, aby zwracać tylko rekordy zawierające litery "Je". Widzę, że zwracana jest właściwa rzecz i że grupa ContactsGrouped jest aktualizowana, ale interfejs użytkownika się nie zmienia.

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

gdzie ugrupowanie wygląda następująco:

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); 
    } 
} 

Biorąc pod uwagę, że używam ObservableCollections, będę oczekiwać lista odświeżenia. Czy brakuje mi czegoś oczywistego?

Odpowiedz

1

Okazuje się, że podczas implementacji INotifyPropertyChanged nadal nie zaktualizuje listy podczas jej filtrowania. Jednak faktoring kodu, który zapełnia listę w VM, a następnie wywołanie tego kodu w metodzie OnTextChanged (a następnie wywołanie resetowania ItemsSource) robi lewę.

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

The PopulateContacts metoda wygląda następująco (skrócone) ...

// 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); 

To działa i jest w miarę czysty i sprawdzalne

1

Zakładam, że klasa Grupowanie jest używana z ViewModel. W takim przypadku, że ViewModel musi implementować interfejs INotifyPropertyChanged takie jak poniżej:

#region INotifyPropertyChanged implementation 

public event PropertyChangedEventHandler PropertyChanged; 

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

#endregion 

Dopóki wywołać metodę OnPropertyChnaged na ustawienie właściwości następnie dostaniesz wyniki wiązania.

Powiązane problemy