在TreeView中选择单个XML绑定项

时间:2009-10-09 18:17:16

标签: wpf visual-studio-2008 xaml data-binding treeview

我正在尝试学习如何将以下简单的XML文件绑定到WPF TreeView

<?xml version="1.0" encoding="utf-8" ?>
<Profiles>

  <Customer>
    <Name>Customer1</Name>    
    <Profile>
      <Version>1.0</Version>
      <DisplayText>DisplayText1</DisplayText>
    </Profile>
    <Profile>
      <Version>1.0</Version>
      <DisplayText>DisplayText2</DisplayText>
    </Profile>
  </Customer>

  <Customer>
    <Name>Customer2</Name>    
    <Profile>
      <Version>1.0</Version>
      <DisplayText>DisplayText3</DisplayText>
    </Profile>    
  </Customer>

</Profiles>

以下是我尝试的XAML代码:

 <TreeView DockPanel.Dock="Left" Height="auto" Name="treeView1" Width="217"
           SelectedItemChanged="UIProfileTreeViewSelectedItemChanged"
           ItemsSource="{Binding}">
     <TreeView.DataContext>
         <XmlDataProvider Source="Profiles.xml" XPath="/Profiles/Customer"/>
     </TreeView.DataContext>
     <TreeView.Resources>
         <DataTemplate DataType="Customer">
             <TreeViewItem Header="{Binding XPath=Name}"
                           ItemsSource="{Binding XPath=Profile}"/>
         </DataTemplate>                
         <DataTemplate DataType="Profile">
             <TreeViewItem Header="{Binding XPath=DisplayText}" />
         </DataTemplate>                
     </TreeView.Resources> 
 </TreeView>

然而,结果阻止我在TreeView中选择客户下的个人资料,如果我点击一个资料,整个群组会突出显示如下:

alt text http://img38.imageshack.us/img38/4484/sberr.png

我明显对数据绑定项的工作方式存在概念错误。有什么指针吗?

1 个答案:

答案 0 :(得分:1)

我能够使用下面的xaml。

我的代码遇到了两个基本问题:

  1. 您的树视图的两个级别都使用“DataTemplate”而不是“外部”级别被定义为“HierarchicalDataTemplate” - 因此您必须将ItemsSource放在TreeViewItem上,这似乎导致“选择为”小组“问题”
  2. 我在使用TreeViewItems完成选择时遇到了麻烦,但是在转换DataTemplates以显示Label之后(你可以在这里显示任何类型的简单或复杂的控件),它完美地运行了。 WPF会自动插入“TreeViewItem”控件来包装绑定到TreeView中的任何内容,因此您无需明确地执行此操作。

        <TreeView DockPanel.Dock="Left" Height="auto" Name="treeView1" Width="217" SelectedItemChanged="UIProfileTreeViewSelectedItemChanged" ItemsSource="{Binding}">
          <TreeView.DataContext>
            <XmlDataProvider Source="Profiles.xml" XPath="/Profiles/Customer"/>
          </TreeView.DataContext>
          <TreeView.Resources>
            <HierarchicalDataTemplate DataType="Customer" ItemsSource="{Binding XPath=Profile}">
                <Label Content="{Binding XPath=Name}" />
            </HierarchicalDataTemplate>
            <DataTemplate DataType="Profile">
                <Label Content="{Binding XPath=DisplayText}" />
            </DataTemplate>
          </TreeView.Resources>
        </TreeView>
    
  3. 希望这有帮助!