将文本块绑定到纯xaml中的当前列表框项

时间:2012-02-02 12:10:36

标签: wpf xaml

我将一些数据保存在xml文件中。 这些将显示在列表框中。 现在,当我更改列表框Selectedindex时,我想根据selectedindex更新文本块中的其他信息。

有没有办法在纯xaml中执行此操作? 如果没有,我如何将Textblock绑定到列表框中的selecteditem?

修改: 如何在不使用列表框的情况下浏览数据?我的意思是使用按钮移动到下一个项目,其他按钮向后移动.. !!

任何帮助都非常感谢..

<Window x:Class="WpfSingleInstance.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <StackPanel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Cornsilk">

        <StackPanel.Resources>
            <XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books">
                <x:XData>
                    <Inventory xmlns="">
                        <Books>
                            <Book ISBN="0-7356-0562-9" Stock="in" Number="9">
                                <Title>XML in Action</Title>
                                <Summary>XML Web Technology</Summary>
                            </Book>
                            <Book ISBN="0-7356-1370-2" Stock="in" Number="8">
                                <Title>Programming Microsoft Windows With C#</Title>
                                <Summary>C# Programming using the .NET Framework</Summary>
                            </Book>
                            <Book ISBN="0-7356-1288-9" Stock="out" Number="7">
                                <Title>Inside C#</Title>
                                <Summary>C# Language Programming</Summary>
                            </Book>
                        </Books>
                    </Inventory>
                </x:XData>
            </XmlDataProvider>
        </StackPanel.Resources>

        <TextBlock FontSize="18" FontWeight="Bold" Margin="10"
HorizontalAlignment="Center">XML Data Source Sample</TextBlock>
        <ListBox
Width="265" Height="98" x:Name="lbox" Background="Honeydew" IsSynchronizedWithCurrentItem="True">
            <ListBox.ItemsSource>
                <Binding Source="{StaticResource InventoryData}"
           XPath="*[@Stock='out'] | *[@Number>=8 or @Number=3]"/>
            </ListBox.ItemsSource>

            <ListBox.ItemTemplate>

                <DataTemplate>
                    <TextBlock FontSize="12" Foreground="Red">
      <TextBlock.Text>
        <Binding XPath="Title"/>
      </TextBlock.Text>
                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        <StackPanel DataContext="{StaticResource InventoryData}">
            <TextBlock Text="{Binding  XPath=Book/Title}"/>
            <TextBox Margin="5,31,98,10" x:Name="textBoxMainDetail" Text="{Binding XPath=Book/Summary}" />
        </StackPanel>
    </StackPanel>



</Grid>

2 个答案:

答案 0 :(得分:2)

你可以像这样绑定:

<TextBox Text="{Binding ElementName=lbox, Path=SelectedItem[Title].InnerText}" />

SelectedItem是XmlElement

编辑:以下是一些示例代码,介绍如何在代码中访问XmlDataProvider的数据,并将其应用为TextBox的DataContent。

像这样更改TextBox.Text绑定:

<TextBox x:Name="textBoxMainDetail" Text="{Binding Path=[Title].InnerText}" />

在代码后面从XmlDataProvider获取XML数据并设置TextBox的DataContext:

XmlDataProvider dataProvider = (XmlDataProvider)stackPanel.Resources["InventoryData"];
XmlElement books = (XmlElement)dataProvider.Document.SelectNodes(dataProvider.XPath)[0];

// set DataContext to an item from the child node collection
textBoxMainDetail.DataContext = books.ChildNodes[0];

请注意,其资源字典中包含XmlDataProvider的StackPanel现在已有名称。如果此代码在应用程序初始化期间运行(例如在Window构造函数中),则XmlDataProvider.IsAsynchronous属性必须设置为false。

现在,您应该可以在按钮单击处理程序中将DataContext更改为books集合的另一个索引项。

答案 1 :(得分:2)

您需要将SelectedValuePath设置为列表框的“标题”。然后使用elementName将textBlock绑定到列表框的selectedValue,如下所示 -

<ListBox Width="265" Height="98" x:Name="lbox" Background="Honeydew"
                     IsSynchronizedWithCurrentItem="True" SelectedValuePath="Title">
            </ListBox>
            <StackPanel DataContext="{StaticResource InventoryData}">
                <TextBlock Text="{Binding Path=SelectedValue, ElementName=lbox}"/>
                <TextBox Margin="5,31,98,10" x:Name="textBoxMainDetail" Text="{Binding XPath=Book/Summary}" />
            </StackPanel>
        </StackPanel>