Как распознать элемент в каком элементе в gridview

Я использую "gridview" не только для "отображения", но и для того, чтобы пользователи могли взаимодействовать, например нажмите кнопку внутри определенного элемента. Предположим, что моя сетка выглядит так:

<Gridview>
  <Gridview.Itemtemplate>
    <DataTemplate>
      <StackPanel>
        <Image> </Image>
        <Button> </Button>
      </StackPanel>
   </DataTemplate>
</Gridview.Itemtemplate>

Если я нажму кнопку, все кнопки всех элементов в сетке будут делать то же самое. Как мы можем нажать на кнопку и узнать, к какому элементу она принадлежит?

* ПРИМЕЧАНИЕ: нажатие только кнопки не вызовет событие «ItemIsSelected», потому что элемент не был нажат, это была кнопка.

Чаще всего вы используете шаблон MVVM и привязываете кнопку к ICommand, затем вы настраиваете в xaml CommandParameter, который будет передавать конкретный связанный элемент команде. Слишком сложно написать ответ, изучите MVVM и при необходимости задайте более конкретные вопросы.

Crowcoder 13.12.2018 12:56

Я использовал шаблон MVVM, но только для цели «чистого кода», поэтому я предполагаю, что вы имеете в виду, используя CommandParameter, чтобы передать «какой элемент он принадлежит» «параметру», но как создать параметр, знающий, что он принадлежит какому элементу?

strypperjason115 13.12.2018 13:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Допустим, ваш предмет является объектом класса LineItem. После нажатия кнопки вы можете использовать sender из аргумента события щелчка, чтобы получить DataContext, который будет тем же объектом.

(sender as FrameworkElement).DataContext

// Маленькая выборка

MainPage.Xaml

<Page
    x:Class = "App1.MainPage"
    xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local = "using:App1"
    xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable = "d" 
    x:Name = "YourPage"

    Background = "{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid>
        <GridView x:Name = "GridView">
            <GridView.ItemTemplate>
                <DataTemplate x:DataType = "local:LineItem">
                    <StackPanel>
                        <TextBlock Text = "{x:Bind Title}"></TextBlock>
                        <TextBlock Text = "{x:Bind  description}"></TextBlock>
                        <Button Content = "Action" Click = "Button_Click"></Button>
                    </StackPanel>
                </DataTemplate>
            </GridView.ItemTemplate>
        </GridView>
    </Grid>
</Page>

MainPage.Xaml.cs

public sealed partial class MainPage : Page
    {
        List<LineItem> MyDictionary = new List<LineItem>();
        public MainPage()
        {
            MyDictionary.Add(new LineItem() { Title = "Item1", description = "Desc1" });
            MyDictionary.Add(new LineItem() { Title = "Item2", description = "Desc2" });
            MyDictionary.Add(new LineItem() { Title = "Item3", description = "Desc3" });
            this.InitializeComponent();
            GridView.ItemsSource = MyDictionary;
        }
        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            LineItem clicked_item  =(LineItem)((sender as FrameworkElement).DataContext);
            await (new MessageDialog(clicked_item.Title + " Button is clicked ")).ShowAsync();
        }
    }
    public class LineItem
    {
        public string Title { get; set; }
        public string description { get; set; }
    }

Другие вопросы по теме