【问题标题】:How to get clicked item in ListView如何在 ListView 中获取被点击的项目
【发布时间】:2012-11-10 22:15:23
【问题描述】:

这应该是一个微不足道的任务,但我找不到如何去做。我想听听点击列表视图中的项目,获取相应的模型对象,然后启动一个新屏幕。

这是 ListView 的 XAML:

<ListView x:Name="ItemListView" 
    ItemTemplate="{StaticResource StoreFrontTileTemplate}"
    ItemContainerStyle="{StaticResource StoreFrontLVTileStyle}"
    Margin="0" VerticalAlignment="Top" ItemClick="MyClick" Tapped="MyTap"/>

还有 MyClick、MyTap:

private void MyClick(object sender, ItemClickEventArgs e)
{
    Debug.WriteLine("Click!");
}

private void MyTap(object sender, TappedRoutedEventArgs e)
{
    Debug.WriteLine("TAp!!" + sender.ToString() + "--" + e.ToString());
}

导航到新屏幕的方法:

this.Frame.Navigate(typeof(SecondScreen));

它可以工作,但我需要单击项目的模型对象并将其作为参数传递给第二个屏幕。

但是 MyClick 从未被调用,并且 MyTap 没有给我任何关于被点击项目的信息。 “发件人”是 ListView。

我下载了这些例子:

http://code.msdn.microsoft.com/windowsapps/XAML-ListView-sample-pack-0ec6b60f

但它不包含我需要的内容,有一个主/详细视图,但它适用于绑定,我想要做的是启动一个完整的新屏幕。

注意:我是 Windows 开发方面的菜鸟,并且倾向于在 Android 或 IOS 中使用通常的方法来实现,在这些方法中,您使用被点击元素的位置实现回调。不知道在 Windows 8 中执行此操作的正确方法。

【问题讨论】:

    标签: c# xaml windows-8


    【解决方案1】:

    您可以使用SelectionChanged 事件:

    <ListView x:Name="ItemListView" SelectionChanged="MySelectionChanged" />
    

    您可以从SelectionChangedEventArgs 获取选中/删除的项目,例如:

    private void MySelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Debug.WriteLine("Selected: {0}", e.AddedItems[0]);
    }
    

    或者,如果您不需要选择功能以及使用什么ItemClick="MyClick" 您需要将IsItemClickEnabled 设置为true

    获取或设置一个值,该值指示视图中的项目是否引发 ItemClick 事件以响应交互。

    <ListView x:Name="ItemListView" 
        ItemTemplate="{StaticResource StoreFrontTileTemplate}"
        ItemContainerStyle="{StaticResource StoreFrontLVTileStyle}"
        Margin="0" VerticalAlignment="Top" ItemClick="MyClick"  
        IsItemClickEnabled="bool" SelectionMode="None"/>
    

    请注意,在这种情况下,您还需要将SelectionMode 设置为None

    【讨论】:

    • 如何获取点击项的索引?
    • @AmoghTalpallikar ItemClickEventArgs 引用了点击的项目
    • 任何建议为什么这不起作用?
    • 如何从分组列表视图的标题中获取单击的项目的键?
    【解决方案2】:

    您可以在 XAML 代码上使用列表视图的 DoubleTapped 事件。 然后,在 C# 代码中,您可以通过以下方式获取位置:

    private void display_DoubleTapped_1(object sender,
         Windows.UI.Xaml.Input.DoubleTappedRoutedEventArgs e)
    {
         int items = display.SelectedIndex;
         // use this index to do something 
    }
    

    【讨论】:

      【解决方案3】:

      我用这个:

      private void ListUI_Tapped(object sender, TappedRoutedEventArgs e)
          {
              if(ListUI.SelectedItems.Count != 0)
              {
                  Debug.WriteLine("It's not a trap at all my friend");
              }
              else
              {
                  Debug.WriteLine("Its a trap");
              }
          }
      

      【讨论】:

        【解决方案4】:
               // We have a class name 'Message' in ControllerLibrary Namespace
        
                 namespace ControllerLibrary
                    {
                      public class Message
                        {
                           public string MessageID { get; set; }
                            public string MessageName { get; set; }
                         }
                    }
        
            // Add name space at page heading
                       xmlns:local1="using:ControllerLibrary"
        
              //At Gridview 
        
                <GridView IsItemClickEnabled="True" Name="UserMessageList">
                 <GridView.ItemTemplate>
                   <DataTemplate x:DataType="local1:Message">                                          <StackPanel Orientation="Horizontal">
                 <Button Content="{x:Bind MessageName}" HorizontalAlignment="Left" Margin="2 0 10 0" Click="btnUserMessage_Click">
                </Button>
                </StackPanel>
                </DataTemplate>
                 </GridView.ItemTemplate>
                </GridView>
        
          //At code Behind
            private void btnAddPage_Click(object sender, RoutedEventArgs e)
              {
                  //Get selecte message
                  var selectedMessage = (sender as Button).DataContext as Message;
              }
        

        【讨论】:

          【解决方案5】:

          我建议,在与 XAML 关联的代码隐藏 C# 文件中,使用作为参数传递给 ItemClickEventArgs 对象的 ClickedItem 属性>ItemClick 事件处理程序。

          示例(对于 GridView,但对于 ListView 的想法相同)

          private void GridView_ItemClick(object sender, ItemClickEventArgs e)
                  {
                      // This is how you determine the clicked item in a GridView,
                      // and obtain the relevant element of the underlying collection
                      // (to which the GridView is bound).
                      // 'Tile' is here the 'type' used in the said collection.
                      Tile output = e.ClickedItem as Tile;
          
                      // ... 
          
                  }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多