我有一个像这样的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事件的一部分吗?
答案 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>