You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 04:55:01