Я пытаюсь создать представление списка, которое я привязываю к контейнеру OservableCollection. Он создает список в порядке, но когда событие щелчка элемента запускается, SelectedIndex всегда -1. Как я могу получить индекс щелкнутого элемента? Каждый элемент также имеет некоторые объекты внутри него. Как получить адресную способность к объектам внутри listviewitem. Я могу получить текст из объекта билета, но доступ к флажку или какой-либо объект, который мне может понадобиться для ввода, меня сбивает с толку. Это проект windows phone 8.1.
Код Xaml
<Page
x:Class="BindingTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:BindingTest"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
<ListView x:Name="LV" IsItemClickEnabled="True" ItemClick="LV_ItemClick">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<Grid x:Name="LVIGrid">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="5*"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<CheckBox HorizontalAlignment="Center" VerticalAlignment="Center"
MinWidth="0"/>
<TextBlock Grid.Column="1" Text="{Binding iflag}"
VerticalAlignment="Center" HorizontalAlignment="Center"
FontSize="36" />
<TextBlock Grid.Column="2" Text="{Binding kflag}"
VerticalAlignment="Center" HorizontalAlignment="Center"
FontSize="36"/>
<TextBlock Grid.Column="3" Text="{Binding qty}"
VerticalAlignment="Center" HorizontalAlignment="Right"
FontSize="36"/>
<TextBlock Grid.Column="4" Text="{Binding itemStr}"
VerticalAlignment="Center" HorizontalAlignment="Center"
FontSize="24"/>
<TextBlock Grid.Column="5" Text="{Binding priceStr}"
VerticalAlignment="Center" HorizontalAlignment="Right"
FontSize="24"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
Код С#
namespace BindingTest
{
public sealed partial class MainPage : Page
{
public ObservableCollection<ticket> ticketCol;
public MainPage()
{
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Required;
ticketCol = new ObservableCollection<ticket>()
{
new ticket(){iflag="I",kflag="k",qty="1",itemStr="Test Item",priceStr="9.99"},
new ticket(){iflag="I",kflag="k",qty="2",itemStr="Test Item",priceStr="9.99"},
new ticket(){iflag="I",kflag="k",qty="3",itemStr="Test Item",priceStr="9.99"},
new ticket(){iflag="I",kflag="k",qty="4",itemStr="Test Item",priceStr="9.99"}
};
LV.ItemsSource = ticketCol;
}
/// <summary>
/// Invoked when this page is about to be displayed in a Frame.
/// </summary>
/// <param name="e">Event data that describes how this page was reached.
/// This parameter is typically used to configure the page.</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
// TODO: Prepare page for display here.
// TODO: If your application contains multiple pages, ensure that you are
// handling the hardware Back button by registering for the
// Windows.Phone.UI.Input.HardwareButtons.BackPressed event.
// If you are using the NavigationHelper provided by some templates,
// this event is handled for you.
}
public void createTable()
{
}
public class ticket
{
public string iflag { get; set; }
public string kflag { get; set; }
public string qty { get; set; }
public string itemStr { get; set; }
public string priceStr { get; set; }
}
private void LV_ItemClick(object sender, ItemClickEventArgs e)
{
string test = ((ticket)e.ClickedItem).itemStr;
int index = LV.SelectedIndex;
}
}
}
Возможно, SelectedIndex
не изменился в момент ItemClick
события ItemClick
. В качестве альтернативы вы можете попытаться получить индекс ObservableCollection
элемента из ObservableCollection
с использованием метода IndexOf()
, например:
private void LV_ItemClick(object sender, ItemClickEventArgs e)
{
var clickedItem = (ticket)e.ClickedItem;
string test = clickedItem.itemStr;
var collection = (ObservableCollection<ticket>)LV.ItemsSource;
int index = collection.IndexOf(clickedItem);
}
Во втором вопросе я не думаю, что есть чистый способ получить элементы управления пользовательского интерфейса из DataTemplate
. XAML лучше всего работает с привязкой данных, поэтому мы можем манипулировать базовой моделью /viewmodel вместо управления пользовательским интерфейсом непосредственно из С#.
Если вам действительно нужно это сделать, возможно, это может помочь (это для WPF): WPF - Получить дочерний элемент управления DataTemplate из пользовательского ListBoxItem