Как получить элемент в ListView

Это должна быть тривиальная задача, но я не могу найти, как это сделать. Я хочу прослушать щелчок по элементу в listview, получить соответствующий объект модели и запустить новый экран.

Это XAML для ListView:

<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.

Я скачал эти exaples:

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

но он не содержит того, что мне нужно, есть представление master / detail, но он работает с привязками, и я хочу запустить новый экран.

Примечание: я noob в разработке Windows и ориентации на обычный способ сделать это в Android или IOS, где вы реализуете обратный вызов с позицией нажатого элемента. Не знаю, как правильно это сделать в Windows 8.

5 ответов


можно использовать SelectionChanged событие:

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

и вы можете получить выбранный/deseleted предметов от SelectionChangedEventArgs например:

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

или если вам не нужна функциональность выбора и что использовать ItemClick="MyClick" вам нужно установить IsItemClickEnabled to true:

получает или задает значение, указывающее, вызывают ли элементы в представлении событие ItemClick в ответ на взаимодействие.

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

Примечание. что в этом случае вам также нужно установить SelectionMode to None.


можно использовать DoubleTapped событие listview в коде XAML. И затем, в коде C# вы можете получить позицию по:

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

Я использую этот:

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

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

Я бы предложил, чтобы в файле кода C#, связанном с XAML, вы использовали ClickedItem свойства ItemClickEventArgs объект передается в качестве аргумента 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;

            // ... 

        }