我有这个列表框:
<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中的代码中工作,这次我必须实现它。
谢谢!
答案 0 :(得分:2)
ListBox使用两个列表:项目(来自ItemsSource
)和ListItemContainer
(控件容器)。
您的TaskStepControl
是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);
}