在這幾個Index中,又尤其以SourceColumnIndex最難取得。由於本程序的DataTemplate都是以XamlReader.Load的方式實現的,如下:
1 string content = string.Format("<common:DataGridButton Name=\"Button{0}\" ColumnIndex=\"{1}\" Content=\"{2}\" Value=\"{{Binding Path={3}}}\" />", i.ToString(), i.ToString(), column.ButtonContent, column.ButtonValuePath);
2 column.CellTemplate = XamlReader.Load(XmlReader.Create(new StringReader(string.Format(template, content)))) as DataTemplate;
這樣處理後,我們即可在該控件中註冊一個事件,並在RoutedEventHandler指定的方法中,使用(e.OriginalSource as DataGridButton).ColumnIndex的方式來取得當前格的SourceColumnIndex。有了SourceColumnIndex之後,其它各個Index就比較容易得到了:
1 int sourceRowIndex = (this.ItemsSource as IList).IndexOf(this.SelectedItem);
2 int sourceColumnIndex = (e.OriginalSource as DataGridButton).ColumnIndex;
3
4 int currentRowIndex = this.Items.IndexOf(this.SelectedItem);
5 int currentColumnIndex = (this.View as GridView).Columns.IndexOf(this._DataGridColumns[sourceColumnIndex]);
6
7 this.RaiseEvent(new DataGridEventArgs(ButtonClickEvent, sourceRowIndex, sourceColumnIndex, currentRowIndex, currentColumnIndex));