2012-11-10 11 views
6

To powinno być banalne zadanie, ale nie mogę go znaleźć. Chcę usłyszeć kliknięcie elementu w widoku listy, pobrać odpowiedni obiekt modelu i uruchomić nowy ekran.Jak uzyskać kliknięcie pozycji w ListView

Jest to XAML dla ListView:

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

I 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()); 
} 

Sposób, aby przejść do nowego ekranu:

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

To działa, ale potrzebuję obiektu modelu klikniętego elementu i przekazać go jako parametr do drugiego ekranu.

Ale MyClick nigdy nie jest wywoływany, a MyTap nie daje mi żadnych informacji o klikniętym przedmiocie. "nadawca" to ListView.

Pobrałem tych przykładów, które:

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

Ale to nie zawiera co muszę, istnieje pogląd master/detal, ale działa z powiązaniami i co chcę zrobić, to uruchomić kompletny nowy ekran.

Uwaga: Jestem noobem w rozwoju systemu Windows i orientuję się na zwykły sposób na zrobienie tego w Androidzie lub IOS, gdzie zaimplementowano wywołanie zwrotne z pozycją klikniętego elementu. Nie mam pojęcia o właściwej drodze, aby to zrobić w Windows 8.

Odpowiedz

27

Można użyć zdarzenia SelectionChanged:

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

I można dostać wybrane/deseleted przedmioty od SelectionChangedEventArgs np

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

Jeśli nie potrzebujesz funkcji wyboru i używania ItemClick="MyClick" , musisz ustawić IsItemClickEnabled na true:

Pobiera lub ustawia wartość wskazującą, czy elementy w widoku powodują podniesienie zdarzenia ItemClick w odpowiedzi na interakcję.

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

Należy zauważyć, że w tym przypadku trzeba także ustawić SelectionMode do None.

+0

Dzięki! kliknij, jak również działa wybór. – Ixx

+2

Jak zdobyć indeks klikniętego przedmiotu? –

+0

@AmoghTalpallikar ItemClickEventArgs ma odniesienie do klikniętego elementu – hendrix

1

Można użyć zdarzenia DoubleTapped zdarzenia widoku listy na kod XAML. a następnie w kod C# można uzyskać stanowisko:

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

Używam tego:

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"); 
     } 
    } 
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; 
     } 
Powiązane problemy