【问题标题】:XAML ListBox to TextBox Update codeXAML ListBox 到 TextBox 更新代码
【发布时间】:2015-04-11 07:51:30
【问题描述】:

我知道我之前问过这个问题的变体,但经过几个小时的测试和研究。我已经设法让我的 XAML 代码达到了我希望它工作的 50%,我需要其他方面的帮助。 我有我的 xaml 代码来将 XML 文件加载到列表框中,并将我的文本框绑定到列表框。但是,当我在 ListBox 中选择另一个值时,文本框的文本不会更新。

<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>

基本上,我要做的是在列表框中选择一个项目,它会显示我的 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>

当前的问题是当我将列表框更改为列表中的另一个 Me 单词时,文本框将仅显示 boku(ぼく),并且不会更改为 watashi(わたし)。

【问题讨论】:

    标签: c# xml xaml textbox listbox


    【解决方案1】:

    在不更改大部分当前代码的情况下使其工作的一种可能方法是修改TextBoxDataContextText 属性绑定,如下所示:

    <ListBox ItemsSource="{Binding XPath=/WordList/Word/English}" .... />
    <TextBox DataContext="{Binding ElementName=listBx, Path=SelectedItem}" 
             Text="{Binding XPath=../Kanji}" ..... />
    

    一些简要说明:

    XPath 仅适用于 XmlDocument/XmlElement DataContext,而 InnerText 不适用。这就是为什么我将TextBoxDataContext 绑定更改为指向ListBoxSelectedItemSelectedItem 包含一个XmlElement 代表&lt;English&gt; 节点)。

    然后我还需要更改TextBoxText 属性的Xpath。由于SelectedItem 指向&lt;English&gt; 节点,您需要上一层才能使用XPath .. 到达&lt;Word&gt; 元素,然后从那里下一层使用XPath /Kanji 到达&lt;Kanji&gt; 元素。

    &lt;English&gt; 节点开始到&lt;Kanji&gt; 节点的另一种可能的XPath 是使用following-sibling 轴:

    Text="{Binding XPath=following-sibling::Kanji}"
    

    结果:

    【讨论】:

    • 非常感谢,我在试图解决这个问题时遇到了很多问题@har07。您不仅解释了 XPath 的工作原理,而且还以我访问过的大多数网站所没有的方式进行了解释。
    • 总是很高兴知道有人理解我在说什么,而不是仅仅找到对他有用的代码就像魔术一样。很高兴听到这个消息,不客气:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多