WPF中DataGridCheckBoxColumn如何获取选中行?
如何获取WPF DataGrid中选中复选框行的指定列值?
你的问题核心在于DataGridCheckBoxColumn没有和DataTable的字段绑定,只是一个独立的UI控件,没法直接同步选中状态到数据源里。下面是具体的解决步骤:
步骤1:给DataTable添加复选框绑定字段
首先要在你的AppsAvailable这个DataTable里新增一个布尔类型的列,用来存储每行复选框的选中状态:
// 在设置ItemsSource之前执行这段代码 if (!AppsAvailable.Columns.Contains("IsSelected")) { // 添加名为IsSelected的布尔列,默认值为false AppsAvailable.Columns.Add("IsSelected", typeof(bool)); }
步骤2:修改XAML绑定复选框列
把原来的DataGridCheckBoxColumn绑定到刚添加的IsSelected字段,这样勾选操作会直接同步到DataTable的行数据中:
<DataGrid Name="AvailableApps" Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="2" Margin="5,30,5,5" ColumnWidth="*" CanUserDeleteRows="False" CanUserAddRows="False" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Application" Binding="{Binding Application}"/> <!-- 绑定到IsSelected字段,允许用户勾选 --> <DataGridCheckBoxColumn Header="Selection" Binding="{Binding IsSelected}" IsReadOnly="False"/> </DataGrid.Columns> </DataGrid>
步骤3:调整原有C#代码
你原来的代码里把复选框列设为了IsReadOnly = true,这会导致用户无法勾选,需要改成false:
AvailableApps.ItemsSource = AppsAvailable.AsDataView(); AvailableApps.IsReadOnly = false; // 取消复选框列的只读状态,让用户可以操作 AvailableApps.Columns[1].IsReadOnly = false;
步骤4:获取选中行的Application值输出到控制台
可以在某个触发事件(比如按钮点击)里遍历DataTable的行,筛选出IsSelected为true的行,取出Application列的值:
private void PrintSelectedApps_Click(object sender, RoutedEventArgs e) { foreach (DataRow row in AppsAvailable.Rows) { // 检查该行是否被选中 if ((bool)row["IsSelected"]) { string appName = row["Application"].ToString(); Console.WriteLine(appName); } } }
如果你更愿意通过DataGrid的Items来遍历,也可以这么写:
foreach (DataRowView rowView in AvailableApps.Items) { DataRow row = rowView.Row; if ((bool)row["IsSelected"]) { Console.WriteLine(row["Application"].ToString()); } }
额外说明
不推荐通过遍历VisualTree找复选框控件的方式来获取选中状态,这种方法耦合UI结构,一旦DataGrid的布局或样式改变就会失效,而绑定数据源的方式更可靠、符合WPF的设计思想。
内容的提问来源于stack exchange,提问作者C. M.
相关产品推荐
相关产品推荐

