在最近的一个项目中,将DataView类型的数据源绑定到ListView控件时,发现当DataView的内容发生变化时,前台的ListView控件的内容并没有发生改变,在这里我先贴出前台要绑定数据源的控件,然后再做进一步分析。
<ListView Name="alarmListView" ItemsSource="{Binding}" Background="AliceBlue" HorizontalAlignment="Left" Width="1280" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled"> <ListView.View> <GridView ColumnHeaderContainerStyle="{StaticResource myControlTemplateStyle}"> <GridViewColumn Header="案件类型" Width="260" CellTemplate="{StaticResource GridViewCellTemplate}"></GridViewColumn> <GridViewColumn Header="办理人员" Width="260" CellTemplate="{StaticResource GridViewCellTemplate1}"></GridViewColumn> <GridViewColumn Header="案件概述" Width="260" CellTemplate="{StaticResource GridViewCellTemplate2}"></GridViewColumn> <GridViewColumn Header="咨询内容" Width="260" CellTemplate="{StaticResource GridViewCellTemplate3}"></GridViewColumn> <GridViewColumn Header="办结日期" Width="260" CellTemplate="{StaticResource GridViewCellTemplate4}"></GridViewColumn> <GridView.ColumnHeaderTemplate> <DataTemplate> <TextBlock FontFamily="Microsoft YaHei" FontSize="35" Foreground="White" Background="#333" Width="275" HorizontalAlignment="Center" TextAlignment="Center"> <TextBlock.Text> <Binding/> </TextBlock.Text> </TextBlock> </DataTemplate> </GridView.ColumnHeaderTemplate> </GridView> </ListView.View> </ListView>
在刚开始的时候,我通过定义一个DataView类型的数据源SourceDataView,使用alarmListView.DataContext=SourceDataView进行数据绑定,当我们改变SourceDataView的时候,界面的数据并没有更新,那么要使界面的数据进行更新,那么数据源类型必须实现了INotifyPropertyChanged接口,通过查找官方文档,这个接口是这样进行定义的:INotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知。那么我们看看该接口中都定义了些什么,在该接口中定义了一个事件 public event PropertyChangedEventHandler PropertyChanged,该事件在属性更改时发生,所以要想数据源更新时界面的数据进行更新,那么该数据源必须具备通知的性质,但是我们的数据源类型是DataView类型,但是回到DataView的定义,DataView : MarshalByValueComponent, IBindingListView, IBindingList, IList, ICollection, IEnumerable, ITypedList, ISupportInitializeNotification, ISupportInitialize所以DataView并没有实现INotifyPropertyChanged接口,所以即使数据源SourceDataView发生改变的时候,界面也不会发生变化的,这点需要我们注意。所以我们通常在进行数据绑定的时候,通常是让一个类实现INotifyPropertyChanged接口,然后将类的某几个属性绑定前台,这里多的情况就不再赘述。
所以上述的方法能够进行一次绑定,但是当数据源变化时并不会更新到界面,所以最后使用ItemsSource属性进行绑定,而不是使用DataContext进行绑定,这样就可以了,所有从ItemsControl继承的控件都拥有该属性,我们直接将数据作为数据源绑定到ListView控件上就可以啦,这篇文章的主要目的在于分析进行数据源绑定的时候数据源的一些特性,这里需要谨记。