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

时间:2014-11-25 15:05:25

标签: c# xamarin xamarin.forms

问题:数据更改但ListView无法更新

我有一个ListView,其ItemsSource设置为

<ListView ItemsSource="{Binding ContactsGrouped}" 

点击按钮我更新查询只返回包含字母&#34; Je&#34;的记录。我可以看到返回正确的东西,并且正在更新ContactsGrouped,但UI不会改变。

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,我希望该列表能够重绘。我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:1)

我假设从ViewModel中使用了Grouping类。在这种情况下,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方法,您就会获得绑定的结果。

答案 1 :(得分:1)

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

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

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

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