WPF中仅用XAML实现DataGrid选中行时勾选对应CheckBox
解决WPF DataGrid行选中时自动勾选对应CheckBox的纯XAML方案
我明白你想纯用XAML实现DataGrid行选中时,该行内的CheckBox自动变为勾选状态的需求,之前尝试的DataGridCell Style触发器失效,是因为CheckBox1位于DataTemplate内部——模板里的控件属于独立的作用域,外部的DataGridCell样式无法直接访问到模板内的元素。
下面是纯XAML的解决方案,核心思路是在CellTemplate的DataTemplate内部,给CheckBox添加一个绑定到父级DataGridRow.IsSelected的DataTrigger:
<DataGrid Name="ChargeDataGrid" Grid.Row="1" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTemplateColumn Width="*"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <CheckBox x:Name="CheckBox1"> <CheckBox.Style> <Style TargetType="CheckBox"> <Style.Triggers> <!-- 绑定到当前行的IsSelected属性,选中时自动勾选CheckBox --> <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="True"> <Setter Property="IsChecked" Value="True"/> </DataTrigger> </Style.Triggers> </Style> </CheckBox.Style> </CheckBox> <TextBlock Text="{Binding}" /> </StackPanel> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.HeaderTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <CheckBox /> <TextBlock Text="Title" /> </StackPanel> </DataTemplate> </DataGridTemplateColumn.HeaderTemplate> </DataGridTemplateColumn> </DataGrid.Columns> <system:String>123</system:String> <system:String>124</system:String> <system:String>125</system:String> <system:String>126</system:String> <system:String>127</system:String> </DataGrid>
补充说明:
- 这里用
RelativeSource={RelativeSource AncestorType=DataGridRow}来找到当前CheckBox所在的DataGrid行,绑定它的IsSelected属性。 - 如果需要实现双向联动(勾选CheckBox时也选中对应行),可以直接用双向绑定替代触发器,写法更简洁:
<CheckBox x:Name="CheckBox1" IsChecked="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=DataGridRow}, Mode=TwoWay}"/>
内容的提问来源于stack exchange,提问作者dihiddie
相关产品推荐
相关产品推荐

