WPF ListBox привязать к индексу элемента - PullRequest
7 голосов
/ 03 ноября 2008

Легко привязать что-либо к SelectedIndex ListBox, но я хочу, чтобы каждый элемент в 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>

Я хочу связать свойство TAG гиперссылки с индексом рассматриваемого элемента. Так что, когда пользователь нажимает гиперссылку, я могу определить, какой элемент вызвал событие, используя свойство TAG этой гиперссылки.

var hyperlink = (Hyperlink)sender;
var index = Convert.ToInt32(hyperlink.Tag);

Предложения

1 Ответ

5 голосов
/ 03 ноября 2008

Насколько я знаю, на самом деле нет свойства, которое бы указывало на индекс вашего элемента. Если у вас есть доступ к исходному списку элементов, к которому привязан ваш ListBox, вы можете получить доступ к DataContext вашей гиперссылки, чтобы определить индекс вашего элемента, например:

var hyperlink = (Hyperlink)sender;
var item = (SourceType)hyperlink.DataContext;
int index = sourceList.IndexOf(item);

Кроме того, вы можете вызвать ItemsControl.ContainerFromElement для гиперссылки, чтобы получить ListBoxItem, связанный с гиперссылкой, а затем найти позицию ListBoxItem в ListBox, но на самом деле вы не получите ничего, чего у вас еще не было. 1004 *

...