Xamarin.Forms - 数据更改时ListView不会更新

Jes*_*rty 7 c# xamarin xamarin.forms

问题:数据更改但ListView不更新

我有一个ListS,其ItemsSource设置为

<ListView ItemsSource="{Binding ContactsGrouped}" 
Run Code Online (Sandbox Code Playgroud)

单击按钮时,我更新查询以仅返回包含字母"Je"的记录.我可以看到正确的东西被返回,并且ContactsGrouped正在更新,但UI不会改变.

public ObservableCollection<Grouping<string, Contact>> ContactsGrouped { get; set; }
Run Code Online (Sandbox Code Playgroud)

分组看起来像这样:

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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

鉴于我正在使用ObservableCollections,我希望该列表能够重绘.我错过了一些明显的东西吗

Jes*_*rty 1

事实证明,虽然实现 INotifyPropertyChanged 在过滤列表时仍然不会更新列表。但是,分解出填充 VM 中列表的代码,然后在 OnTextChanged 方法中调用该代码(随后调用重置 ItemsSource)就可以解决问题。

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

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 );
Run Code Online (Sandbox Code Playgroud)

这有效,并且相当干净且可测试