WPF ListBox绑定到项目的索引

Tim*_*hyP 7 data-binding wpf datatemplate

将一些东西绑定到ListBox的SelectedIndex很容易,但我希望ListBox中的每个项都能够绑定到列表中的索引.

可能听起来很奇怪,所以这就是我要做的事情:

<DataTemplate x:Key="ScenarioItemTemplate">
<Border
    Margin="8,2,8,2"
    Background="#FF3C3B3B"
    BorderBrush="#FF797878"
    BorderThickness="2"
    CornerRadius="5">
    <DockPanel>
        <DockPanel DockPanel.Dock="Top" Margin="0,2,0,0">
            <Label HorizontalAlignment="Left"
                   DockPanel.Dock="Left"
                   FontWeight="Heavy"
                   Foreground="White"
                   Content="{Binding Path=Position}"
                   MinWidth="50"/>

            <Label
                   Content="{Binding Path=Name}"
                   DockPanel.Dock="Left"
                   FontWeight="Heavy"
                   Foreground="white"/>
            <Label 
                   Content="{Binding Path=Header}"
                   Foreground="white"
                   DockPanel.Dock="Left"/>

            <TextBlock HorizontalAlignment="Right" 
                       Background="#FF3C3B3B" 
                       DockPanel.Dock="Left" Foreground="White" FontWeight="Heavy">
                <Hyperlink Click="CloseHyperlink_Click" Tag="">X</Hyperlink>
            </TextBlock>
Run Code Online (Sandbox Code Playgroud)

我想将超链接的TAG属性绑定到相关项的索引.因此,当用户单击超链接时,我可以使用该超链接的TAG属性确定导致事件的项目.

var hyperlink = (Hyperlink)sender;
var index = Convert.ToInt32(hyperlink.Tag);
Run Code Online (Sandbox Code Playgroud)

建议?

Dav*_*ell 5

据我所知,实际上没有一个属性可以指示您项目的索引.如果您可以访问ListBox绑定到的项目的原始列表,则可以访问超链接的DataContext以确定项目的索引,如下所示:

var hyperlink = (Hyperlink)sender;
var item = (SourceType)hyperlink.DataContext;
int index = sourceList.IndexOf(item);
Run Code Online (Sandbox Code Playgroud)

或者,您可以在超链接上调用ItemsControl.ContainerFromElement以获取与超链接关联的ListBoxItem,然后在ListBox中找到ListBoxItem的位置,但它并不能真正获得您尚未拥有的任何内容.