7

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>

ハイパーリンクの TAG プロパティを問題のアイテムのインデックスにバインドしたいと考えています。ユーザーがハイパーリンクをクリックしたときに、そのハイパーリンクの TAG プロパティを使用して、イベントの原因となったアイテムを特定できるようにします。

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

提案?

4

1 に答える 1

5

私の知る限り、アイテムのインデックスを示すプロパティは実際にはありません。ListBox がバインドされているアイテムの元のリストにアクセスできる場合は、ハイパーリンクの DataContext にアクセスして、次のようにアイテムのインデックスを決定できます。

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

または、ハイパーリンクで ItemsControl.ContainerFromElement を呼び出して、ハイパーリンクに関連付けられた ListBoxItem を取得し、ListBox 内の ListBoxItem の位置を見つけることもできますが、実際には、まだ取得していないものは何も得られません。

于 2008-11-03T16:17:02.810 に答える