如何识别网格视图中哪个项目中的元素
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; }
}
我使用 "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; }
}