如何获取动态添加到ListBox的项的索引

时间:2012-09-21 23:11:13

标签: c# windows-phone-7 xaml listbox

我想获取动态添加的列表框中项目的当前索引。基本上我的项目是HubTile,并且在一次点击事件中添加了hubtile。 hubtile项目的集合保存在ObservableCollection中。这个observablecolelction绑定到一个显示项目的列表框。为了说明,我所拥有的内容如下:

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项目已正确添加到UI中,但在点击事件中我不知道如何获取当前点击的HubTile项目的选定索引?

2 个答案:

答案 0 :(得分:0)

使tileItems成为一个公共属性,并在XAML中将它作为源绑定到它。

添加一个public int并将其路径绑定为SelectedIndex

<ListBox ItemsSource="{Binding Path=Rules}" SelectedIndex="{Binding Path=SelectedIndex, Mode=TwoWay}">

答案 1 :(得分:0)

您可以使用单击的项目的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
}

您还可以订阅ListBox的SelectionChanged事件,而不是Hubtile的Tap事件。然后在Selectionchanged事件中,您可以获得索引。

private void OnSelectionChanged(object sender, SelectionChangedEventArgs selectionChangedEventArgs)
    {
        int index = tileList.SelectedIndex;
    }