XAML技术咨询:如何通过ComboBox切换DataGrid的XPath绑定显示对应Schedule
问题描述
ComboBox已正常显示XML数据,DataGrid也能读取XML中的单条记录,但卡在实现以下需求:
- 选择ComboBox中的选项时,动态修改DataGrid的XPath,显示对应的Schedule记录
试过Multi-binding等方法都没成功,求帮忙。
用户提供的原始XAML代码:
<Window.Resources> <!-- Data. --> <XmlDataProvider x:Key="Schedules" XPath="Schedules"> <x:XData> <Schedules xmlns=""> <Schedule Id="0" Name="Week-1" Saturday="0" Sunday="0" Monday="7.5" Tuesday="7.5" Wednesday="7.5" Thursday="7.5" Friday="7.5" /> <Schedule Id="1" Name="Week-2" Saturday="0" Sunday="0" Monday="7.5" Tuesday="7.5" Wednesday="7.5" Thursday="7.5" Friday="7.5" /> <Schedule Id="2" Name="Week-3" Saturday="7.5" Sunday="7.5" Monday="7.5" Tuesday="7.5" Wednesday="7.5" Thursday="0" Friday="0" /> </Schedules> </x:XData> </XmlDataProvider> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <StackPanel Grid.Row="0"> <ComboBox Name="SchedulesComboBox" Width="200" Height="40" VerticalContentAlignment="Center" ItemsSource="{Binding XPath=//Schedule/@Name, Source={StaticResource Schedules}}" /> </StackPanel> <StackPanel Grid.Row="0"> <DataGrid Name="DataGrid" Margin="0, 25, 0, 0" Grid.Row="1" ItemsSource="{Binding XPath=//*[@Id\=\'1\'], Source={StaticResource Schedules}, IsAsync=True}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridComboBoxColumn Header="Schedule" Width="200" /> <DataGridTextColumn Header="Saturday" Width="100" Binding="{Binding XPath=@Saturday}" /> <DataGridTextColumn Header="Sunday" Width="100" Binding="{Binding XPath=@Sunday}" /> <DataGridTextColumn Header="Monday" Width="100" Binding="{Binding XPath=@Monday}" /> <DataGridTextColumn Header="Tuesday" Width="100" Binding="{Binding XPath=@Tuesday}" /> <DataGridTextColumn Header="Wednesday" Width="100" Binding="{Binding XPath=@Wednesday}" /> <DataGridTextColumn Header="Thursday" Width="100" Binding="{Binding XPath=@Thursday}" /> <DataGridTextColumn Header="Friday" Width="100" Binding="{Binding XPath=@Friday}" /> </DataGrid.Columns> </DataGrid> </StackPanel> </Grid>
解决方案
1. 调整ComboBox绑定逻辑
原来的ComboBox只绑定了Name属性,无法获取对应Schedule的Id,改成绑定完整的Schedule节点,通过DisplayMemberPath指定显示Name:
<ComboBox Name="SchedulesComboBox" Width="200" Height="40" VerticalContentAlignment="Center" ItemsSource="{Binding XPath=//Schedule, Source={StaticResource Schedules}}" DisplayMemberPath="@Name" />
2. 动态绑定DataGrid的ItemsSource
通过嵌套绑定,用ComboBox选中项的Id作为XPath过滤条件,替换硬编码的Id值:
<DataGrid Name="DataGrid" Margin="0, 25, 0, 0" ItemsSource="{Binding XPath=//Schedule[@Id={Binding ElementName=SchedulesComboBox, Path=SelectedItem.(@Id)}], Source={StaticResource Schedules}, IsAsync=True}" AutoGenerateColumns="False">
3. 修正布局重叠问题
原来两个StackPanel都设置了Grid.Row="0",会导致控件重叠,把第二个StackPanel的Grid.Row改为1:
<StackPanel Grid.Row="1"> <!-- DataGrid放在这里 --> </StackPanel>
4. 完善DataGrid的Schedule列
把原来空的DataGridComboBoxColumn改成DataGridTextColumn,绑定Schedule的Name属性:
<DataGridTextColumn Header="Schedule" Width="200" Binding="{Binding XPath=@Name}" />
完整修改后的XAML代码
<Window.Resources> <!-- Data. --> <XmlDataProvider x:Key="Schedules" XPath="Schedules"> <x:XData> <Schedules xmlns=""> <Schedule Id="0" Name="Week-1" Saturday="0" Sunday="0" Monday="7.5" Tuesday="7.5" Wednesday="7.5" Thursday="7.5" Friday="7.5" /> <Schedule Id="1" Name="Week-2" Saturday="0" Sunday="0" Monday="7.5" Tuesday="7.5" Wednesday="7.5" Thursday="7.5" Friday="7.5" /> <Schedule Id="2" Name="Week-3" Saturday="7.5" Sunday="7.5" Monday="7.5" Tuesday="7.5" Wednesday="7.5" Thursday="0" Friday="0" /> </Schedules> </x:XData> </XmlDataProvider> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <StackPanel Grid.Row="0"> <ComboBox Name="SchedulesComboBox" Width="200" Height="40" VerticalContentAlignment="Center" ItemsSource="{Binding XPath=//Schedule, Source={StaticResource Schedules}}" DisplayMemberPath="@Name" /> </StackPanel> <StackPanel Grid.Row="1"> <DataGrid Name="DataGrid" Margin="0, 25, 0, 0" ItemsSource="{Binding XPath=//Schedule[@Id={Binding ElementName=SchedulesComboBox, Path=SelectedItem.(@Id)}], Source={StaticResource Schedules}, IsAsync=True}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Schedule" Width="200" Binding="{Binding XPath=@Name}" /> <DataGridTextColumn Header="Saturday" Width="100" Binding="{Binding XPath=@Saturday}" /> <DataGridTextColumn Header="Sunday" Width="100" Binding="{Binding XPath=@Sunday}" /> <DataGridTextColumn Header="Monday" Width="100" Binding="{Binding XPath=@Monday}" /> <DataGridTextColumn Header="Tuesday" Width="100" Binding="{Binding XPath=@Tuesday}" /> <DataGridTextColumn Header="Wednesday" Width="100" Binding="{Binding XPath=@Wednesday}" /> <DataGridTextColumn Header="Thursday" Width="100" Binding="{Binding XPath=@Thursday}" /> <DataGridTextColumn Header="Friday" Width="100" Binding="{Binding XPath=@Friday}" /> </DataGrid.Columns> </DataGrid> </StackPanel> </Grid>
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

