XAML ListBox 到 TextBox 更新代码
XAML ListBox to TextBox Update code
我知道我以前问过这个问题的变体,但经过几个小时的测试和研究。我已经设法让我的 XAML 代码达到我希望它工作的 50%,我需要其他帮助。
我有我的 xaml 代码来将 XML 文件加载到列表框中,并将我的文本框绑定到列表框。但是,当我 select 列表框中的另一个值时,文本框的文本不会更新。
<Window x:Class="BeginnersJapanese.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="274" Width="525">
<Window.Resources>
<XmlDataProvider x:Key="XmlData"
Source="https://www.dropbox.com/s/jgw84kqj2k1bwq1/JapaneseEnglishData.xml?dl=1"
XPath="WordList/Word"/>
</Window.Resources>
<Grid Margin="0,0,0,1">
<Grid.DataContext>
<XmlDataProvider x:Name="XmlData" Source="https://www.dropbox.com/s/jgw84kqj2k1bwq1/JapaneseEnglishData.xml?dl=1" XPath="WordList/Word"/>
</Grid.DataContext>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Content="Speak" Name="speakBtn" HorizontalAlignment="Left" Margin="252,158,0,0" Grid.Row="1" VerticalAlignment="Top" Width="121" Click="speakButton_Click"/>
<ListBox Name="listBx" HorizontalAlignment="Left" ItemsSource="{Binding XPath=/WordList/Word/English}" Height="225" Margin="10,10,0,0" Grid.Row="1" VerticalAlignment="Top" Width="152" IsSynchronizedWithCurrentItem="True"/>
<TextBox Name="txtBox" HorizontalAlignment="Left" Height="23" Margin="167,110,0,0" Grid.Row="1" TextWrapping="Wrap" DataContext="{Binding ElementName=listBx, Path=SelectedItem.InnerText}" Text="{Binding XPath=Kanji}" VerticalAlignment="Top" Width="340" IsReadOnly="True"/>
</Grid>
</Window>
本质上,我想要做的是 select 列表框中的一个项目,它显示我的 xml 文件中的日语对应项。看起来像:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--This is a generated XML File-->
<WordList>
<Word>
<English>Me</English>
<Romaji>boku</Romaji>
<Kanji>ぼく</Kanji>
</Word>
<Word>
<English>I</English>
<Romaji>boku</Romaji>
<Kanji>ぼく</Kanji>
</Word>
<Word>
<English>Me</English>
<Romaji>watashi</Romaji>
<Kanji>わたし</Kanji>
</Word>
</WordList>
目前的问题是,当我将列表框更改为列表中的另一个我的单词时,文本框只会显示 boku(ぼく) 而不会更改为 watashi(わたし)。
一种无需更改大部分当前代码即可使其工作的可能方法是,修改 TextBox
的 DataContext
和 Text
属性绑定,如下所示:
<ListBox ItemsSource="{Binding XPath=/WordList/Word/English}" .... />
<TextBox DataContext="{Binding ElementName=listBx, Path=SelectedItem}"
Text="{Binding XPath=../Kanji}" ..... />
一些简单的解释:
XPath
仅对 XmlDocument/XmlElement DataContext
有效,而 InnerText
无效。这就是为什么我将 TextBox
的 DataContext
绑定更改为指向 ListBox
的 SelectedItem
(SelectedItem
包含一个 XmlElement
表示 <English>
节点).
然后我还需要更改 TextBox
的 Text
属性 的 Xpath。由于 SelectedItem
指向 <English>
节点,您需要使用 XPath ..
向上爬一级到达 <Word>
元素,然后从那里向下一级到达 <Kanji>
元素使用 XPath /Kanji
.
从 <English>
节点开始到 <Kanji>
节点的另一种可能的 XPath 是使用 following-sibling
轴:
Text="{Binding XPath=following-sibling::Kanji}"
结果:
我知道我以前问过这个问题的变体,但经过几个小时的测试和研究。我已经设法让我的 XAML 代码达到我希望它工作的 50%,我需要其他帮助。 我有我的 xaml 代码来将 XML 文件加载到列表框中,并将我的文本框绑定到列表框。但是,当我 select 列表框中的另一个值时,文本框的文本不会更新。
<Window x:Class="BeginnersJapanese.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="274" Width="525">
<Window.Resources>
<XmlDataProvider x:Key="XmlData"
Source="https://www.dropbox.com/s/jgw84kqj2k1bwq1/JapaneseEnglishData.xml?dl=1"
XPath="WordList/Word"/>
</Window.Resources>
<Grid Margin="0,0,0,1">
<Grid.DataContext>
<XmlDataProvider x:Name="XmlData" Source="https://www.dropbox.com/s/jgw84kqj2k1bwq1/JapaneseEnglishData.xml?dl=1" XPath="WordList/Word"/>
</Grid.DataContext>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Content="Speak" Name="speakBtn" HorizontalAlignment="Left" Margin="252,158,0,0" Grid.Row="1" VerticalAlignment="Top" Width="121" Click="speakButton_Click"/>
<ListBox Name="listBx" HorizontalAlignment="Left" ItemsSource="{Binding XPath=/WordList/Word/English}" Height="225" Margin="10,10,0,0" Grid.Row="1" VerticalAlignment="Top" Width="152" IsSynchronizedWithCurrentItem="True"/>
<TextBox Name="txtBox" HorizontalAlignment="Left" Height="23" Margin="167,110,0,0" Grid.Row="1" TextWrapping="Wrap" DataContext="{Binding ElementName=listBx, Path=SelectedItem.InnerText}" Text="{Binding XPath=Kanji}" VerticalAlignment="Top" Width="340" IsReadOnly="True"/>
</Grid>
</Window>
本质上,我想要做的是 select 列表框中的一个项目,它显示我的 xml 文件中的日语对应项。看起来像:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--This is a generated XML File-->
<WordList>
<Word>
<English>Me</English>
<Romaji>boku</Romaji>
<Kanji>ぼく</Kanji>
</Word>
<Word>
<English>I</English>
<Romaji>boku</Romaji>
<Kanji>ぼく</Kanji>
</Word>
<Word>
<English>Me</English>
<Romaji>watashi</Romaji>
<Kanji>わたし</Kanji>
</Word>
</WordList>
目前的问题是,当我将列表框更改为列表中的另一个我的单词时,文本框只会显示 boku(ぼく) 而不会更改为 watashi(わたし)。
一种无需更改大部分当前代码即可使其工作的可能方法是,修改 TextBox
的 DataContext
和 Text
属性绑定,如下所示:
<ListBox ItemsSource="{Binding XPath=/WordList/Word/English}" .... />
<TextBox DataContext="{Binding ElementName=listBx, Path=SelectedItem}"
Text="{Binding XPath=../Kanji}" ..... />
一些简单的解释:
XPath
仅对 XmlDocument/XmlElement DataContext
有效,而 InnerText
无效。这就是为什么我将 TextBox
的 DataContext
绑定更改为指向 ListBox
的 SelectedItem
(SelectedItem
包含一个 XmlElement
表示 <English>
节点).
然后我还需要更改 TextBox
的 Text
属性 的 Xpath。由于 SelectedItem
指向 <English>
节点,您需要使用 XPath ..
向上爬一级到达 <Word>
元素,然后从那里向下一级到达 <Kanji>
元素使用 XPath /Kanji
.
从 <English>
节点开始到 <Kanji>
节点的另一种可能的 XPath 是使用 following-sibling
轴:
Text="{Binding XPath=following-sibling::Kanji}"
结果: