Как получить информацию о родительском элементе , нажав на кнопку в дочернем
Пишу WPF-приложение для автосервиса. У меня есть список объектов класса Client, содержащих в себе список строк и другие свойства:
public class Client
{
public uint Id { get; set; }
public string CarModel { get; set; }
public string ClientName { get; set; }
public List<string> ActiveTasks { get; set; }
public List<string> CompletedTasks { get; set; }
}
Для отображения карточек с этими клиентами я с помощью чатгпт написал следующий код. Мне было важно, чтобы возле каждого элемента списка активных и завершенных задач была кнопка, которая соответственно завершает или возвращает в список активных задачу. Код XAML:
<ItemsControl x:Name="cardsItemsControl" ScrollViewer.HorizontalScrollBarVisibility="Auto">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderThickness="3" BorderBrush="Black" Margin="5" Padding="5">
<StackPanel>
<TextBlock Text="{Binding CarModel}" FontWeight="Bold" FontSize="16"/>
<TextBlock Text="{Binding ClientName}" FontSize="14" Margin="0 5"/>
<Separator Margin="0 5"/>
<ScrollViewer MaxHeight="250">
<StackPanel>
<TextBlock Text="Активные задачи" FontWeight="Bold" FontSize="14"/>
<ItemsControl ItemsSource="{Binding ActiveTasks}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding}" FontSize="12"/>
<Button Content="✔" Click="CompleteTask_Click" Tag="{Binding}" Margin="30 0 15 0"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock Text="Завершенные задачи" FontWeight="Bold" FontSize="14" Margin="0 10 0 5"/>
<ItemsControl ItemsSource="{Binding CompletedTasks}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding}" FontSize="12"/>
<Button Content="↩" Click="RestoreTask_Click" Tag="{Binding}" Margin="30 0 15 0"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</ScrollViewer>
</StackPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Дальше мне нужно сделать обработчик событий для нажатия на кнопки. Сейчас они выглядят так (вариант от нейросети):
private void CompleteTask_Click(object sender, RoutedEventArgs e)
{
// Обработчик события для кнопки "✔" (перевести задачу в завершенные)
Button button = (Button)sender;
string task = button.Tag.ToString();
// Найти соответствующего клиента и переместить задачу из активных в завершенные
foreach (Client client in Clients)
{
if (client.ActiveTasks.Contains(task))
{
client.ActiveTasks.Remove(task);
client.CompletedTasks.Add(task);
RefreshItemsControl(cardsItemsControl);
break;
}
}
}
Разумеется, проблема этого кода в том, что он проходится по всем клиентам в списке. Мне же нужно, чтобы я мог узнать, в какой именно карточке была нажата кнопка. Я могу использовать button.Tag, только чтобы узнать какая именно задача была нажата, но не в какой карточке. Помогите пожалуйста