如何将列表框从另一个列表框绑定到SelectedItem的XPath?

时间:2013-09-10 14:52:25

标签: xml wpf xaml xpath binding

这是XML:

<Items>
    <Item>
        <Name>Item1</Name>
        <Links>
            <Link>
                <LinkText>Image 1</LinkText>
                <LinkUri>Images/Image1.jpg</LinkUri>
            </Link>
            <Link>
                <LinkText>Image 2</LinkText>
                <LinkUri>Images/Image2.jpg</LinkUri>
            </Link>
        </Links>
    </Item>
    <Item>
        <Name>Item2</Name>
        <Links>
            <Link>
                <LinkText>Image 3</LinkText>
                <LinkUri>Images/Image3.jpg</LinkUri>
            </Link>
            <Link>
                <LinkText>Image 4</LinkText>
                <LinkUri>Images/Image4.jpg</LinkUri>
            </Link>
        </Links>
    </Item>
</Items>

这是第一个ListBox

的绑定
<Grid.Resources>
        <XmlDataProvider
            x:Key="Items"
            Source="ScannerProblems.xml"
            XPath="Items" />            
</Grid.Resources>

<ListBox
                x:Name="lstProblems"
                Grid.Row="0"
                Grid.RowSpan="3"
                Grid.Column="0"
                IsSynchronizedWithCurrentItem="True"
                ItemsSource="{Binding Source={StaticResource Items}, XPath=Item}"
                DisplayMemberPath="{Binding}">
                <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border
                        Background="#2200FF00"
                        BorderBrush="Black"
                        BorderThickness="1"
                        CornerRadius="8"
                        Margin="2,4,2,4"
                        Padding="4">

                        <StackPanel
                            x:Name="sp">
                            <TextBlock
                                FontWeight="Bold">Problem Description</TextBlock>

                            <TextBlock
                                Width="{Binding ElementName=sp, Path=ActualWidth}"
                                Text="{Binding XPath=Name}"
                                TextWrapping="Wrap" />
                        </StackPanel>
                    </Border>
                    </DataTemplate>
                </ListBox.ItemTemplate>

                <ListBox.ItemContainerStyle>
                    <Style
                        TargetType="ListBoxItem">
                        <Setter
                            Property="HorizontalContentAlignment"
                            Value="Stretch" />
                    </Style>
                </ListBox.ItemContainerStyle>
            </ListBox>

所以从那ListBox我选择一个项目。当我选择该项目时,我想让另一个ListBox填充所选项目的XML中的链接项目。看起来它应该是小菜一碟,但我试过的不同的东西在ListBox中给我一个空的System.Windows.DataTemplateListBox(只有一次,而不是一个列表次)。

编辑:从这里开始,我已经修改了。这是建议更改后第二个ListBox的标记。对于将来使用此问题的人来说,现在看来是这样的:

<ListBox
            DataContext="{Binding SelectedItem, ElementName=lstProblems}"
            ItemsSource="{Binding XPath=Links/Link}"
            Grid.Row="1"
            Grid.Column="1"
            Grid.ColumnSpan="2"
            IsSynchronizedWithCurrentItem="False">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Button Content="{Binding}">
                        <Button.ContentTemplate>
                            <DataTemplate>
                                <StackPanel>
                                    <Image
                                        Margin="10"
                                        MaxHeight="200"
                                        Source="{Binding XPath=LinkUri}" />

                                    <TextBlock
                                        Text="{Binding XPath=LinkText}"
                                        TextWrapping="Wrap"
                                        Margin="10,0,10,20" />
                                </StackPanel>
                            </DataTemplate>
                        </Button.ContentTemplate>
                    </Button>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

1 个答案:

答案 0 :(得分:1)

您的DataTemplate应位于<ListBox.ItemTemplate>下以获取第二个列表。目前,您正在其下直接设置,这就是您看到类名的原因。由于您直接使用集合设置DataContext,因此您必须设置ItemsSource={Binding}