Ein Silverlight Datagrid kann im Column Template auch andere Controls enthalten, wie z.B. einen Button. Wie kann man aber erkennen welcher Button geclickt wurde. Dieser Artikel zeigt zwei Möglichkeiten.
Die Daten kommen aus ado.net data Service und einem entity datamodel. Wie das funktioniert ist nicht Bestandteil dieses Blog Posts. Als Datenbank dient Northwind und als Tabelle Customer. Bei Click auf den Button kommt eine Messagebox hoch und zeigt Infos über die Row an.
Zunächst der XAML Code indem der Button definiert wird.
<Grid x:Name="LayoutRoot" Background="White">
<data:DataGrid x:Name="DataGrid1" >
<data:DataGrid.Columns>
<data:DataGridTemplateColumn Width="100">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="{Binding CustomerID}" Click="Button_Click" Tag="{Binding CustomerID}"></Button>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
</data:DataGrid.Columns>
</data:DataGrid>
Mit Hilfe des Tag Attributes werden ID Daten an den Button gebunden
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
MessageBox.Show(CType(e.OriginalSource, Button).Tag)
End Sub
Wem das zu einfach ist kann auch die Reihe auslesen indem man den Datacontext des Buttons mit der Liste vergleicht. Der folgende Code gibt dann die Reihe als Nummer aus die geclickt wurde
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Dim datenliste As List(Of ServiceReference1.Customers)
datenliste = DataGrid1.ItemsSource 'automatischer cast
Dim datenButton As Object = CType(e.OriginalSource, Button).DataContext()
MessageBox.Show(datenliste.IndexOf(datenButton))
End Sub