Как получить элемент в 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;
// ...
}