Я создаю приложение, которое будет отображать список кнопок в двумерной сетке, аналогично Как заполнить сетку WPF на основе двумерного массива
Задача состоит в том, чтобы чтобы сказать, какая кнопка (в терминах i, j) была нажата в обработчике buttonClick
.
Сначала я хотел, чтобы имя кнопки включало строковое представление i, j (например, 'button_2_3) '), но невозможно указать имя с помощью' {binding ...} '.
NOT возможно использовать метку кнопки (button.content
), так как требование к приложению состоит в том, чтобы на кнопках отображались неуникальные метки (метка кнопок представляет фигуру в ячейке, аналогично шахматам, где метка «Q» указывает положение ферзей).
Кажется, лучшая альтернатива сохранить представление строки / столбца в атрибуте CommandParameter кнопки.
Мой вопрос: Как заполнить CommandParameter каждой кнопки таким образом, чтобы было просто извлечь (i, j) нажатой кнопки? Есть ли лучшая альтернатива для прикрепления пользовательских данных к кнопке?
От: Как заполнить сетку WPF на основе двумерного массива
<Window.Resources>
<DataTemplate x:Key="DataTemplate_Level2">
<Button Content="{Binding}" Height="40" Width="50" Margin="4,4,4,4" click="buttonClick"/>
</DataTemplate>
<DataTemplate x:Key="DataTemplate_Level1">
<ItemsControl ItemsSource="{Binding}" ItemTemplate="{DynamicResource DataTemplate_Level2}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
А
public Window1()
{
List<List<int>> lsts = new List<List<int>>();
for (int i = 0; i < 5; i++)
{
lsts.Add(new List<int>());
for (int j = 0; j < 5; j++)
{
lsts[i].Add(i * 10 + j);
}
}
InitializeComponent();
lst.ItemsSource = lsts;
}
private void buttonClick(object sender, EventArgs e)
{
//do something or...
Button clicked = (Button) sender;
MessageBox.Show("Button's name is: " + clicked.Name);
}