Получить объекты и SelectedIndex из ListViewItem

1

Я пытаюсь создать представление списка, которое я привязываю к контейнеру 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;
    }
}

}

Теги:
xaml
listview
windows-phone-8

1 ответ

2
Лучший ответ

Возможно, 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

  • 1
    Спасибо, что отлично сработал для поиска индекса, а ссылка - именно то, что мне нужно для получения объектов внутри DataTemplate.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню