前台:框架
<DataGrid x:Name="TestCaseDataGrid" ItemsSource="{Binding}" >
{binding} 是个简写的方式,绑定的是datagrid 对象的DataContextmvvm
后台:this
this.TestCaseDataGrid.DataContext = Data.PagerSource;
Data.PagerSource是什么类型?spa
public ObservableCollection<T> PagerSource { get { return pagerSource; } set { pagerSource = value; NotifyPropertyChanged("PagerSource"); } }
public class ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChangedcode
经过查看定义,原来绑定的是个泛型集合,并且还实现了两个接口,这两个接口定义了集合变更的事件,界面和ViewModel实现数据同步的。对象
T表明了一个ViewModel对象,ViewModel对象的属性和UI界面同步的话,须要实现INotifyPropertyChanged这个接口blog
public event PropertyChangedEventHandler PropertyChanged; protected void Notify(string propName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propName)); } }
PropertyChanged 这个事件是何时订阅呢?我不由有这样的疑问,想想,也是wpf mvvm框架订阅了这个事件。在网上查了下:
咱们看看前台的绑定状况接口
<DataGridTextColumn Header="标题" Width="3*" Binding="{Binding SearchTitle, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
想想微软如何处理?事件
打开DataGridTextColumn类,发现了两个方法:get
这说明了框架自动生成列单元格,不是TextBox,就是TextBlock,而咱们在界面上绑定的值,其实最后赋给它们的Text属性了。
这是父类中定义的方法,绑定的处理,看来就在这里面了,有兴趣的话,再去研究。
好了,今天就到这里。