2014-11-25 26 views
7

Vấn đề: thay đổi dữ liệu nhưng ListView không cập nhậtXamarin.Forms - ListView không cập nhật khi dữ liệu thay đổi

Tôi có một ListView mà ItemsSource được thiết lập để

<ListView ItemsSource="{Binding ContactsGrouped}" 

On bấm vào một nút Tôi cập nhật truy vấn để chỉ trả về các bản ghi chứa các chữ cái "Je". Tôi có thể thấy rằng điều đúng đang được trả về, và ContactsGrouped đang được cập nhật, nhưng giao diện người dùng không thay đổi.

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

nơi Nhóm trông như thế này:

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

Cho rằng tôi đang sử dụng ObservableCollections, tôi mong đợi danh sách để vẽ lại. Tôi có thiếu một cái gì đó hiển nhiên?

Trả lời

1

Chỉ ra rằng trong khi triển khai INotifyPropertyChanged vẫn không cập nhật danh sách khi lọc. Tuy nhiên, bao thanh toán ra các mã mà populates danh sách trong máy ảo và sau đó gọi mã đó trong phương pháp OnTextChanged (theo sau là một cuộc gọi để đặt lại các ItemsSource) hiện các trick.

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

Các PopulateContacts phương pháp trông như thế này (tóm tắt) ...

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

đó làm việc, và là một cách hợp lý trong sạch và kiểm chứng

1

Tôi cho rằng lớp Nhóm được sử dụng từ ViewModel. Trong trường hợp đó ViewModel có để thực hiện các giao diện INotifyPropertyChanged như dưới đây mà:

#region INotifyPropertyChanged implementation 

public event PropertyChangedEventHandler PropertyChanged; 

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

#endregion 

Chừng nào bạn gọi phương thức OnPropertyChnaged về thiết tài sản sau đó bạn sẽ nhận được kết quả của các ràng buộc.

Các vấn đề liên quan