Как получить индекс элемента, динамически добавляемого в ListBox

Я хотел бы получить текущий индекс элемента в списке, который был добавлен динамически. По сути, мой элемент — это HubTile, и hubtiles добавляются по событию клика по одному. Коллекция элементов hubtile хранится в ObservableCollection. Эта наблюдаемая коллекция привязана к списку, в котором отображаются элементы. Чтобы проиллюстрировать, то, что у меня есть, выглядит следующим образом:

TabsPage.xaml

<ListBox x:Name="tileList" Grid.Row="0" Margin="12,0,12,0" toolkit:TiltEffect.IsTiltEnabled="True">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <toolkit:WrapPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <toolkit:HubTile Title="{Binding TileName}" Margin="6"
                                         Notification="{Binding Notification}"
                                         DisplayNotification="{Binding DisplayNotification}"
                                         Message="{Binding Message}"
                                         GroupTag="{Binding GroupTag}"
                                         Source="{Binding ImageUri}"
                                         Tap="hubTile_Tap">
                        <toolkit:ContextMenuService.ContextMenu>
                            <toolkit:ContextMenu x:Name="menu">
                                <toolkit:MenuItem Header="pin to start" Tap="MenuItem_Tap"/>
                                <toolkit:MenuItem Header="delete" Tap="deleteMenuItem_Tap"/>
                            </toolkit:ContextMenu>
                        </toolkit:ContextMenuService.ContextMenu>
                    </toolkit:HubTile>

                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

TabsPage.xaml.cs

ObservableCollection<TileItem> tileItems;

public TabsPage()
    {
        InitializeComponent();

        CreateTileList(); //starts the list of HubTiles with a single main tile
    }

private void CreateTileList()
    {
        tileItems = new ObservableCollection<TileItem>()             
        {            
            //TileItem is     
            new TileItem() { ImageUri = mainImage, Title = "main", /*Notification = "",*/ Message = "main", GroupTag = "MainGroup", TileName = "main" },

        };

        //Set the first tile item
        this.tileList.ItemsSource = tileItems;  //sets the tileList Listbox ItemsSource to the tileItems ObservableCollection            

    }

void addNew_Click(object sender, EventArgs e)
    {
        BitmapImage newTileImage = new BitmapImage();

        var newItem = new TileItem() { ImageUri = newTileImage, Title = "new", /*Notification = "",*/ Message = "new HubTile", GroupTag = "TileGroup", TileName = "new" };
        tileItems.Add(newItem); //update UI immediately and add to collection
    }

private void hubTile_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
        //how to get the current index of the tapped HubTile//
        //var tap = (((sender as HubTile).Parent as ListBox).SelectedIndex); //NullReferenceException thrown
    }

Итак, элементы HubTile правильно добавляются в пользовательский интерфейс, но при касании события я не знаю, как получить выбранный индекс текущего касаемого элемента HubTile?


person Matthew    schedule 21.09.2012    source источник


Ответы (2)


Вы можете использовать DataContext элемента, щелкнутого таким образом

private void hubTile_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
    FrameworkElement element = (FrameworkElement)sender;
    TileItem item = (TileItem)element.DataContext;
    int index = tileItems.IndexOf(item);
    // Use the index
}

Вы также можете подписаться на событие SelectionChanged в ListBox вместо события Tap в Hubtile. Затем в событии Selectionchanged вы можете получить индекс.

private void OnSelectionChanged(object sender, SelectionChangedEventArgs selectionChangedEventArgs)
    {
        int index = tileList.SelectedIndex;
    }
person Shawn Kendrot    schedule 21.09.2012

Сделайте tileItems общедоступным свойством и привяжите его в XAML как источник.

Добавьте публичный int и привяжите путь к нему как SelectedIndex

<ListBox ItemsSource="{Binding Path=Rules}" SelectedIndex="{Binding Path=SelectedIndex, Mode=TwoWay}">
person paparazzo    schedule 21.09.2012