模板中控件的ListBox项的索引

时间:2012-05-05 06:56:46

标签: windows-phone-7 listbox

我有这个列表框:

<ListBox x:Name="MyList" ItemsSource="{Binding ListOfBullets, Mode=TwoWay, Converter=StaticResourcedebugConverter}}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                                <local:TaskStepControl Text="{Binding}" AddHnadler="{Binding DelegateForHandlingAddTaskStep, ElementName=uc}"></local:TaskStepControl>                          
                        </DataTemplate>
                    </ListBox.ItemTemplate>
</ListBox>

绑定工作正常。 每个本地:TaskStepControl都有一个Add按钮,它连接到AddHnadler。 AddHnadler看起来像这样:

void AddHnadler(TaskStepControl theControl)
{
   // "theControl" --> this TaskStepControl on which the Add button was pressed
   //In here I want to get the index of "theControl" in the ListBox "MyList". 
   //I've tried

   var pos = MyList.Items.IndexOf(theControl);

   //pos == -1  always  
}

我无法使用SelectionChanged事件,因为每个TaskStepControl上的Add按钮都不会将Click事件传递给ListBox。

我通常在xaml之后的代码中工作,所以这可能非常简单,但我无法让它工作。 我需要像“IndexOf”这样简单的东西,没有MVVM的东西,正如我所说,我通常在xaml中的代码中工作,这次我必须实现它。

谢谢!

1 个答案:

答案 0 :(得分:2)

ListBox使用两个列表:项目(来自ItemsSource)和ListItemContainer(控件容器)。

您的TaskStepControlListItemContainer的孩子,因此无法在两个列表中使用。出于您的目的,我会利用DataContext(和列表项)继承到TaskStepControl的事实:

// FYI: 'Hnadler' was a typo here
void AddHandler(TaskStepControl theControl)
{
   object listItem = theControl.DataContext;

   var itemContainerGenerator = MyList.ItemContainerGenerator;

   DependencyObject itemContainer = itemContainerGenerator.ContainerFromItem(listItem);

   int pos = itemContainerGenerator.IndexFromContainer(itemContainer);
}