如何在ListView中获取单击的项目

时间:2012-11-10 22:15:23

标签: c# xaml windows-8

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

这是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也不会向我提供有关所点击项目的任何信息。 “sender”是ListView。

我下载了这些exaples:

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

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

注意:我是Windows开发中的菜鸟,并且采用通常的方式在Android或IOS中执行此操作,您可以使用单击元素的位置实现回调。不知道在Windows 8中正确的方法。

5 个答案:

答案 0 :(得分:27)

您可以使用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

答案 1 :(得分:1)

您可以在XAML代码上使用listview的 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 
}

答案 2 :(得分:1)

我用这个:

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");
        }
    }

答案 3 :(得分:0)

       // 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;
      }

答案 4 :(得分:0)

I would suggest that, in the code-behind C# file associated to the XAML, you use the ClickedItem property of the ItemClickEventArgs object passed as argument to the ItemClick event handler.

Example (for a GridView, but it's the same idea for a 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;

            // ... 

        }