C#WPF:将选定父节点的子节点显示为网格

时间:2010-08-03 13:45:07

标签: c# wpf xml

我有一个像这样的xml:

<root>
<project name="p1">
 <row field1="31" field2="3" Name="Joe"/>
  <row field1="39" field2="3" Name="Joey"/>
  <row field1="37" field2="3" Name="Joei"/>
</project>
<project name="p2">
 <row field1="31" field2="3" Name="Joe"/>
  <row field1="39" field2="3" Name="Joey"/>
</project>
</root>

现在列表框显示项目。在列表框中选择项目时,网格必须显示行。是否可以在Xaml中执行此操作?或者我应该在代码中将它作为listbox的selectionChanged事件的一部分吗?

1 个答案:

答案 0 :(得分:1)

是。只需命名ListBox,将DataGrid的DataContext属性绑定到ListBox的SelectedItem属性,然后将DataGrid的ItemsSource设置为相应的xml节点。

请参阅下面的代码。但它使用的是ListView,而不是DataGrid。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <XmlDataProvider x:Key="data">
        <x:XData>
            <root xmlns="">
                <project name="p1">
                    <row field1="31" field2="3" Name="Joe"/>
                    <row field1="39" field2="3" Name="Joey"/>
                    <row field1="37" field2="3" Name="Joei"/>
                </project>
                <project name="p2">
                    <row field1="31" field2="3" Name="Joe"/>
                    <row field1="39" field2="3" Name="Joey"/>
                </project>
            </root>
        </x:XData>
    </XmlDataProvider>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="3*"/>
    </Grid.ColumnDefinitions>

    <ListBox x:Name="listBox" ItemsSource="{Binding Source={StaticResource data}, XPath=root/project}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding XPath=@name}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    <ListView Grid.Column="1" DataContext="{Binding ElementName=listBox, Path=SelectedItem}" ItemsSource="{Binding XPath=row}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Field1" DisplayMemberBinding="{Binding XPath=@field1}"/>
                <GridViewColumn Header="Field2" DisplayMemberBinding="{Binding XPath=@field2}"/>
                <GridViewColumn Header="Field3" DisplayMemberBinding="{Binding XPath=@Name}"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>