ItemsSource绑定中遇到的问题
一个bug我查了两天才查出结果,所以今天特此一记。
我在GridView中绑定了ItemsSource,但是当数据源变化时,UI却没有变化,设断点一查,binding的数据在XAML中已经更新了,但是UI就是没有变化。其实这是由于一个不好的习惯引起的,就是数据源用的是List<T>类型。
<GridView x:Name="CardListView" ItemsSource="{Binding Path=CardList}"> <GridView.ItemTemplate> <DataTemplate> ... </DataTemplate> </GridView.ItemTemplate> </GridView>
其中CardList在ViewModel中是这样定义的
private List<CardViewModel> _cardlist = new List<CardViewModel>(); public List<CardViewModel> CardList { get { return _cardlist; } set { if (_cardlist != value) { _cardlist = value; RaisePropertyChanged("CardList"); } } }
这样的话初始数据是可以绑定上的,但是改变CardList的话,UI的数据不会有变化。
如果想要动态的绑定数据的话,需要将数据集的类型改为ObservableCollection<T>
private ObservableCollection<CardViewModel> _cardlist = new ObservableCollection<CardViewModel>(); public ObservableCollection<CardViewModel> CardList { get { return _cardlist; } set { if (_cardlist != value) { _cardlist = value; RaisePropertyChanged("CardList"); } } }
这样UI就可以显示新的数据了。
msdn中有对ObservableCollection的介绍:http://msdn.microsoft.com/zh-cn/magazine/dd252944.aspx
以前习惯性的用List,就没想过是数据集类型的问题,结果弄了两天,唉。。。。。。