1

我有这个列表框:

<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>

绑定工作正常。每个 local: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 上的添加按钮不会将 Click 事件传递给 ListBox。

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

谢谢!

4

1 回答 1

2

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

TaskStepControl是 the 的孩子,ListItemContainer因此在这两个列表中都不可用。出于您的目的,我将利用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);
}
于 2012-05-05T07:28:14.073 回答