如何识别网格视图中哪个项目中的元素

How to recognize element in which item in the gridview

我使用 "gridview" 不仅是为了 "display",还让用户与诸如 单击特定项目内的按钮。 假设我的 gridview 是这样的:

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

如果我按下按钮,gridview 中所有项目的每个按钮都会做同样的事情。 我们如何才能按下按钮并知道它属于哪个项目?

*注意:仅按下按钮不会触发 "ItemIsSelected" 事件,因为点击的不是项目,而是按钮。

让我们假设您的项目是 class 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; }
    }