【问题标题】:Binding XML-Data to a TreeView将 XML 数据绑定到 TreeView
【发布时间】:2011-03-01 13:19:50
【问题描述】:

我有一个这样的 xml:

<root>
  <settings>
     ....
     ...
     ..
  </settings>
  <cards>
    <card name="firstcard">
      <question>bla</question>
      <answer>blub</answer>
    </card>
    <card name="nextcard">
      <question>bla</question>
      <answer>blub</answer>
    </card>
  </cards>
</root>

我会将它绑定到一个树视图,该树视图向我显示卡片及其名称和子项。此外,我会将其绑定到文本框以编辑节点(问题、答案)。我在 stackoverflow 上找到了描述:Two-way binding of Xml data to the WPF TreeView 但我无法根据需要更改它:-( 以下是我最后一次尝试:

<Window.Resources>
    <HierarchicalDataTemplate DataType="cards" ItemsSource="{Binding XPath=card}">
        <TextBox Text="cards" />
    </HierarchicalDataTemplate>
    <HierarchicalDataTemplate DataType="card">
        <StackPanel>
            <TextBox Text="{Binding XPath=question}"></TextBox>
            <TextBox Text="{Binding XPath=answer}" Margin="0,0,0,15"></TextBox>
        </StackPanel>
    </HierarchicalDataTemplate>
    <XmlDataProvider x:Key="dataxml" XPath="root/cards" Source="path\cards.xml" />
</Window.Resources>
..
...
    <Label Content="question:"/>
    <TextBox DataContext="{Binding ElementName=treeView, Path=SelectedItem}" 
             Text="{Binding XPath=question, UpdateSourceTrigger=PropertyChanged}"/>
    <Label Content="answer:"/>
    <TextBox DataContext="{Binding ElementName=treeView, Path=SelectedItem}" 
             Text="{Binding XPath=answer, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
<Grid>
    <TreeView Name="treeView" ItemsSource="{Binding Source={StaticResource dataxml}, XPath=.}" />
</Grid>

【问题讨论】:

  • 你的代码到底有什么问题?
  • 我不知道如何将属性名称绑定到文本框,并且树视图和文本框之间的绑定不起作用。

标签: c# wpf xml data-binding treeview


【解决方案1】:

因为“名称”是一个属性而不是子节点,所以您需要使用 XPath=@name 才能使其工作。

Josh Smith here 有一篇不错的文章

【讨论】:

  • 谢谢,articel 帮助了 :-) 现在我可以打印出属性了。但是与文本框的绑定仍然是一个问题。它只选择卡片的最后一个元素:-(
  • 我认为问题在于您的 TreeView 内部有文本框,我不太明白。如果您想使用 TreeView 之外的 TextBox 编辑数据,则不需要它们。将它们更改为 TextBlocks 就可以了。
  • 用我的 HierarchicalDataTemplat 鼠标点击选择问题和答案,这就是为什么我的代码不起作用:-(任何解决方法?
【解决方案2】:

在coldandtired的帮助下我已经解决了:-) 如果可以的话,我会将您的答案标记为有用 ;-) 在工作代码下方:

<HierarchicalDataTemplate DataType="cards" ItemsSource="{Binding XPath=card}">
    <TextBox Text="somethings" />
</HierarchicalDataTemplate>

<HierarchicalDataTemplate DataType="card">
    <StackPanel>
        <TextBlock Text="{Binding XPath=@name}"/>
        <TextBlock Text="{Binding XPath=question}"/>
        <TextBlock Text="{Binding XPath=answer}" Margin="0,0,0,15"/>
    </StackPanel>
</HierarchicalDataTemplate>
...
..
..
<XmlDataProvider x:Key="dataxml" XPath="root/cards" Source="folder\cards.xml" />

        <Label Height="28" Content="Frage:" Margin="0,0,0,177" />
        <TextBox DataContext="{Binding ElementName=treeView, Path=SelectedItem}" Text="{Binding XPath=answer, UpdateSourceTrigger=PropertyChanged}" Margin="0,44,0,136" />
        <Label Height="28" Content="Antwort:" Margin="0,102,0,94" />
        <TextBox DataContext="{Binding ElementName=treeView, Path=SelectedItem}" Text="{Binding XPath=question, UpdateSourceTrigger=PropertyChanged}" Margin="0,136,0,0" />
    </Grid>
    <Grid>
        <TreeView Name="treeView" ItemsSource="{Binding Source={StaticResource dataxml}, XPath=.}"/>
    </Grid>

【讨论】:

  • 很高兴听到!相当烦人的是,几个月前我不得不自己做几乎同样的事情,我找不到我把项目放在哪里:)
猜你喜欢
  • 2011-07-06
  • 2010-09-19
  • 2012-12-10
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 2017-07-09
相关资源
最近更新 更多