问题:数据更改但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,我希望该列表能够重绘。我错过了一些明显的东西吗?
答案 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 );
有效,并且相当干净且可测试