none
如何绑定 类似 嵌套类或属性关联 的 xml 档? RRS feed

  • 问题

  • <MyData>
      <Products>

        <Product Name="成品1">
          <MateriaList>
            <Materia ID="3"/>
            <Materia ID="7"/>
          </MateriaList>
        </Product>
        <Product Name="成品2">
          <MateriaList>
            <Materia ID="3"/>
            <Materia ID="5"/>
            <Materia ID="6"/>
          </MateriaList>
        </Product>
          ..... <!-- 更多 的 product -->
      </Products>


      <MateriasInfo>
          <Materia ID="1" Name="材料1" Type="Metal" .../>
          <Materia ID="2" Name="材料2" Type="Metal" .../>
          <Materia ID="3" Name="材料3" Type="Metal" .../>
          <Materia ID="4" Name="材料4" Type="Metal" .../>
          <Materia ID="5" Name="材料5" Type="Metal" .../>
          <Materia ID="6" Name="材料6" Type="Metal" .../>
          <Materia ID="7" Name="材料7" Type="Metal" .../>
           .... <!-- 更多的材料 , 材料上有更多的属性-->
      </MateriasInfo>
    </MyData>


    xaml 用一个 ListBox 显示 成品, 当一个成品被选中时, 用一个 ListView 显示这个成品 所需要的材料 及这个材料的明细:
    ...
    <XmlDataProvider x:Key="mydata" Source="C:\mydata.xml" XPath="MyData"/>
     <!-- mydata.xml 就是指上面所描述的档案 --!>
    ..
    <DockPanel Grid.ColumnSpan="6">
     <ListBox x:Name="lbProducts"
                  IsSynchronizedWithCurrentItem="True"
                  ItemsSource="{Binding Source={StaticResource mydata}, XPath=Products/Product}">
      <ListBox.ItemTemplate>
       <DataTemplate>
        <ContentPresenter Content="{Binding XPath=@Name}"/>
       </DataTemplate>
      </ListBox.ItemTemplate>
     </ListBox>

     <ListView
              IsSynchronizedWithCurrentItem="True"
              ItemsSource="{Binding ElementName=lbProducts, Path=SelectedItem.ChildNodes[0].ChildNodes}">
      <ListView.View>
       <GridView>
        <GridViewColumn Header="ID" DisplayMemberBinding="{Binding XPath=@ID}"/>
        <GridViewColumn Header="Type" DisplayMemberBinding="?????????????????"/>    就像关联型的数据库一样, 节点属性指向另外的节点
         .................. // 更多的关于单个材料的属性显示...

       </GridView>
      </ListView.View>
     </ListView>
    </DockPanel>



    这种问题就像 将一个表的数据显示, 但该表中某一个字段是另一个表的名称:
       TableA
           字段1   字段2   字段3    字段4   引用字段5     ...
              val1    val2    val3     val4       TableB     ...
              ...        ...        ...       ...         TableC    ...
              ..       ...            ..    ...              ...         ...

     另外的表:
        TableB
        TableC
        ...


    类似上面这类问题, 在 xaml 中应该如何直接绑定呢? (不考虑在 代码中构建对应 Class 的情形下), 是否可以实现?
    Thanks.


    Hello, everyone
    2009年12月22日 18:29

全部回复

  • 楼主你好,

    我好奇的是你在引用字段5中要显示TableB和TableC,但是是显示表名还是其他什么信息呢?如果要显示其他的信息,你可以在binding中加一个value converter.

    谢谢。
    Jim Zhou -MSFT
    2009年12月25日 7:44
    版主
  • 多谢回复,我的意思是 显示一个 成品, 然后鼠标移动到 所显示的成品时,弹出tooltip, tooltip 显示的是这些成品的原料 (并且确切显示出这些原料的资讯)。

    在 xml 档中,原料都集中在一个节点, 成品集中在另一节点。
    <xmlroot>
      <Products>
         <product name="成品1" ...>
            <materiaList>
              <materia id="6"/>
              <materia id="9"/>
           </materiaList>
        </product>
        ...
      </products>
      <materias>
        <materia id="1" name="mat1" attribute1="att1" attribute2="att2" .../>
        <materia id="2" name="mat2" attribute1="att1" attribute2="att2" .../>
        ...
      </materias>
    </xmlroot>

    products 各个子节点是成品,显示在 ListBox (wrapped panel), 在设置其 ItemTemplate 时,我需要设置 鼠标悬停时 ,显示一则 tooltip,
    tooltip 显示的是该成品 的原料的详细资讯, 而不只是 id.

    目前我绑定 listbox 的 items 是 products 所有子节点,在设定 template 时无法从某个成品的 原料 的 id 读取 materias 对应节点的资讯。
    <DataTemplate>   ------------ 这里对应一个 Product 节点
      <StackPanel>
         <Image .../>
        <TextBlock Text="{Binding XPath=@Name}"/>
         <StackPanel.ToolTip>
            <ToolTip>
               <ListView ... ItemsSource="{Binding XPath=materiaList}">    ---------这里是一则该 product 的各种原料资讯
                   <listview.view>
                      <gridview>
                           <gridviewcolumn header="原料名称" displaymemberbinding="{???}"/>
                           ..................................... "原料属性1" ..............................="{???}"/>
                      </gridview>
                   </listview.view>
               </ListView>
            </ToolTip>
         </StackPanel.ToolTip>
      </StackPanel>
    </DataTemplate>


    我想知道的是有没有办法 不必在代码中构造类别(无代码支持的情形) 就可以实现上面的显示, 因为我是写在一份 page 而不在 window 中,期望双击这个 page.xaml 后在 ie 中显示预计的效果。
    Thanks.
    Hello, everyone
    2010年1月15日 1:30
  • 楼主你好,
    --> 然后鼠标移动到 所显示的成品时,弹出tooltip, tooltip 显示的是这些成品的原料 (并且确切显示出这些原料的资讯)。

    这种情况下,你用一个正常的Tooltip就可以实现了,当mouse移上去你要显示的控件时,就显示相关的pop-up信息了。

    如有疑问,请继续回复。

    谢谢。
    Jim Zhou -MSFT
    2010年1月15日 8:12
    版主