2014-11-25 2 views
7

Проблема: изменения данных, но ListView не обновляютXamarin.Forms - ListView не обновляют, когда данные изменения

У меня есть ListView, чьи ItemsSource установлен в

<ListView ItemsSource="{Binding ContactsGrouped}" 

На нажатием одной кнопки Я обновляю запрос, чтобы возвращать записи, содержащие буквы «Je». Я вижу, что правильная вещь возвращается, и что ContactsGrouped обновляется, но пользовательский интерфейс не изменяется.

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

где Группировка выглядит следующим образом:

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

Учитывая, что я использую ObservableCollections, я бы ожидать, что список перерисовывать. Мне что-то не хватает?

ответ

1

Оказывается, что при реализации INotifyPropertyChanged до сих пор не обновляется список при его фильтрации. Однако, факторинг кода, который заполняет список в виртуальной машине и затем вызывает этот код в методе OnTextChanged (за которым следует вызов сброса ItemsSource), делает трюк.

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

The PopulateContacts метод выглядит следующим образом (в сокращенном виде) ...

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

Это работает, и является достаточно чистым и проверяемым

1

Предполагаю, что класс группировки используется из ViewModel. В этом случае, что ViewModel должен реализовать интерфейс INotifyPropertyChanged, такие, как показано ниже:

#region INotifyPropertyChanged implementation 

public event PropertyChangedEventHandler PropertyChanged; 

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

#endregion 

Пока вы называете OnPropertyChnaged метода на установку свойства, то вы получите результаты связывания.

Смежные вопросы