前台:
<DataGrid x:Name="TestCaseDataGrid" ItemsSource="{Binding}" >
{binding} 是個簡寫的方式,綁定的是datagrid 對象的DataContext
后台:
this.TestCaseDataGrid.DataContext = Data.PagerSource;
Data.PagerSource是什么類型?
public ObservableCollection<T> PagerSource { get { return pagerSource; } set { pagerSource = value; NotifyPropertyChanged("PagerSource"); } }
public class ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged
通過查看定義,原來綁定的是個泛型集合,而且還實現了兩個接口,這兩個接口定義了集合變動的事件,界面和ViewModel實現數據同步的。
T代表了一個ViewModel對象,ViewModel對象的屬性和UI界面同步的話,需要實現INotifyPropertyChanged這個接口
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類,發現了兩個方法:
這說明了框架自動生成列單元格,不是TextBox,就是TextBlock,而我們在界面上綁定的值,其實最后賦給它們的Text屬性了。
這是父類中定義的方法,綁定的處理,看來就在這里面了,有興趣的話,再去研究。
好了,今天就到這里。