【问题标题】:How to recognize element in which item in the gridview如何识别gridview中哪个项目中的元素
【发布时间】:2019-05-14 15:10:40
【问题描述】:

我使用“gridview”不仅是为了“显示”,还可以让用户与之交互,例如 单击特定项目内的按钮。 假设我的 gridview 是这样的:

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

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

*注意:仅按下按钮不会触发“ItemIsSelected”事件,因为该项目不是单击,而是按钮。

【问题讨论】:

  • 大多数情况下,您使用 MVVM 模式并将按钮绑定到 ICommand,然后在 xaml 中配置 CommandParameter,这会将特定的绑定项传递给命令。写一个答案太多了,请研究 MVVM 并在需要时提出更具体的问题。
  • 我确实使用了 MVVM 模式,但只是为了“干净代码”的目的,所以我猜你的意思是使用 CommandParameter 将“它属于哪个项目”传递给“参数”,但是如何创建一个参数知道它属于哪个项目?

标签: c# xaml gridview uwp


【解决方案1】:

让我们考虑您的项目是LineItem 类的对象。一旦触发按钮点击,您可以使用点击事件参数中的sender 来获取DataContext,这将是同一个对象。

(作为 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; }
    }

【讨论】:

    猜你喜欢
    • 2017-04-09
    • 1970-01-01
    • 2023-02-15
    • 2019-05-08
    • 1970-01-01
    • 2018-03-30
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多