前臺:框架
<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屬性了。
這是父類中定義的方法,綁定的處理,看來就在這裏面了,有興趣的話,再去研究。
好了,今天就到這裏。