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
相关产品推荐
相关产品推荐

