选择datatemplate中的列表框项

时间:2011-09-01 18:38:11

标签: wpf data-binding listbox datatemplate selecteditem

我有一个使用数据模板的列表框。模板非常简单,由Image和TextBlock组成。它们都绑定到XML文档。模板如下:

<Window.Resources>
    <XmlDataProvider x:Key="NinjaData" Source="\Data\Ninjas.xml" XPath="/Ninjas"/>                      
    <DataTemplate x:Key="NinjaDataTemplate">        
        <StackPanel>                
            <StackPanel Orientation="Horizontal" Margin="0">
                <Image Source="{Binding XPath=ImageFile}" Margin="5" Width="50"/>
                <TextBlock Text="{Binding XPath=@Name}" Margin="5" FontFamily="OCR A Std" Foreground="#FF9114" FontSize="14" Name="NinjaName"/>                   
            </StackPanel>
        </StackPanel>        
    </DataTemplate>
</Window.Resources>

列表框如下:

<ListBox Background="{x:Null}" BorderBrush="{x:Null}"
                ItemsSource="{Binding Source={StaticResource NinjaData}, XPath=Ninja}"
                ItemTemplate="{StaticResource NinjaDataTemplate}"
                >   
                    <ListBox.Resources>
                        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Gray"></SolidColorBrush>                                                      
                    </ListBox.Resources>
                    <ListBox.Effect>
                        <DropShadowEffect ShadowDepth="1" Color="#FF282828"/>
                    </ListBox.Effect>
                    </ListBox>

当我在列表框中单击时,我无法弄清楚如何在数据模板中检索TextBlock的内容。我想在页面上的其他地方的标签中显示它,但我无法弄清楚如何访问该文本块。

任何人都可以帮助并指出我正确的方向吗?我觉得我现在正在转圈。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

由于你有一个ListBox,你可以使用选择,只需命名ListBox并绑定到SelectedItem:

<ListBox Name="lb" ... />
<Label DataContext="{Binding SelectedItem, ElementName=lb}"
       Content="{Binding XPath=@Name}"/>

这不会检索模板中TextBlock的Text,而是从与模板相同的源获取它。 (你实际上可以在模板中定位TextBlock,但我不推荐它)

答案 1 :(得分:0)

将MouseLeftButtonUp事件处理程序添加到datatemplate内的textblock,如:

<TextBlock Text="{Binding XPath=@Name}" Margin="5" FontFamily="OCR A Std" Foreground="#FF9114" FontSize="14" Name="NinjaName" MouseLeftButtonUp="TextBlock_MouseLeftButtonUp"/>

现在您的 TextBlock_MouseLeftButtonUp 应如下所示:

private void TextBlock_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    TextBlock txt = sender as TextBlock;
}

现在做任何你喜欢的 txt