Как и почти все остальное в WPF, вероятно, лучше использовать привязку данных.
Вы можете создать класс для кнопок и связать ItemsSource
с их коллекцией вместо использования XmlDataProvider
; Я использую XML, потому что в качестве примера вы можете легко скопировать и вставить:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<XmlDataProvider x:Key="Data">
<x:XData>
<Data xmlns="">
<Button Row="0" Column="0" Text="First"/>
<Button Row="1" Column="3" Text="Second"/>
<Button Row="4" Column="4" Text="Third"/>
</Data>
</x:XData>
</XmlDataProvider>
</Page.Resources>
<DockPanel Height="300" Width="300">
<ItemsControl ItemsSource="{Binding Source={StaticResource Data}, XPath=/Data/Button}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button Grid.Row="{Binding XPath=@Row}"
Grid.Column="{Binding XPath=@Column}"
Content="{Binding XPath=@Text}"
Click="Button_Click"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DockPanel>
</Page>
Обработчик событий должен выглядеть следующим образом (не проверено, поскольку я написал выше в Kaxaml):
private void Button_Click(object sender, EventArgs e)
{
Button b = (Button) sender;
XmlElement elm = (XmlElement)b.DataContext;
int row = Convert.ToInt32(elm.GetAttribute("Row"));
int column = Convert.ToInt32(elm.GetAttribute("Column"));
// now do whatever you need to do with the row and column
}
Ключевым моментом здесь является то, что DataContext
кнопки содержит всю информацию, которую вы будете использовать для события Click
- конечно, строку и столбец, а также любые другие свойства, которые необходимо связать с кнопкой. Чем больше вы работаете с таким подходом, тем меньше кода и разметки для WPF вы в конечном итоге напишите.