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

DataGrid绑定ItemsSource后如何绑定DataContext内的属性?

问题原因

DataGrid单元格模板内元素的默认DataContext是ItemsSource绑定集合的单个子项,所以你直接写{Binding SetLimitCommand}会去子项对象里找对应属性,自然找不到外层ViewModel的属性。

解决方法

你只需要显式指定绑定的源为外层DataGrid的DataContext即可,有两种常用实现方式:

方式1:使用RelativeSource查找父级控件(推荐,无需额外命名控件)

首先纠正你原代码的错误:Checked是RadioButton的路由事件,不能直接绑定命令,要绑定到RadioButton自带的Command属性,如果你需要把当前选中的行数据传到命令里,还可以加CommandParameter传递当前子项:

<DataGrid DataContext="{Binding ViewModels[0]}" ItemsSource="{Binding LimitItems}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Width="55" Header="Select">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <!-- 绑定外层ViewModel的SetLimitCommand,同时把当前行数据作为参数传入 -->
                    <RadioButton 
                        Command="{Binding DataContext.SetLimitCommand, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                        CommandParameter="{Binding}"
                        GroupName="Setting" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn
            Width="120"
            Binding="{Binding MeasItem}"
            Header="MeasureItem" />
    </DataGrid.Columns>
</DataGrid>

方式2:使用ElementName指定绑定源

先给DataGrid设置x:Name,绑定的时候直接通过控件名获取外层DataContext:

<DataGrid x:Name="LimitDataGrid" DataContext="{Binding ViewModels[0]}" ItemsSource="{Binding LimitItems}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Width="55" Header="Select">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <RadioButton 
                        Command="{Binding DataContext.SetLimitCommand, ElementName=LimitDataGrid}"
                        CommandParameter="{Binding}"
                        GroupName="Setting" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <!-- 其余列保持不变 -->
    </DataGrid.Columns>
</DataGrid>

特殊场景补充

如果你确实需要监听Checked事件而不是用默认的点击触发Command,可以引入Microsoft.Xaml.Behaviors.Wpf包,用事件触发器把Checked事件转成命令绑定即可,不需要改后台逻辑。

内容的提问来源于stack exchange,提问作者Tony Chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:57:04