如果需要选择datagrid行,请使用checkboxcolumn

时间:2009-11-14 16:10:21

标签: c# wpf checkbox datagrid wpfdatagrid

我在c#4.0中使用DataGridCheckBoxColumn。现在如果我启用行选择,我需要2次点击才能更改CheckBox的状态。

单击一次选择行,第二次更改CheckBox的状态。如何启用行选择,但保持1次单击以更改CheckBoxColumn的状态?

<DataGrid AutoGenerateColumns="False"
          SelectionMode="Single"   SelectionUnit="CellOrRowHeader"
          ItemsSource="{Binding}" 
          Height="200" HorizontalAlignment="Left" Margin="28,43,0,0"
          Name="gridPersons" VerticalAlignment="Top" Width="292" >
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Width="SizeToCells" MinWidth="150"
                            Binding="{Binding Name}" 
                            IsReadOnly="True"/>
        <DataGridCheckBoxColumn Header="Selected" Width="SizeToCells" MinWidth="100"
                                Binding="{Binding IsSelected}"  
                                IsReadOnly="false"/>
    </DataGrid.Columns>
</DataGrid>

2 个答案:

答案 0 :(得分:2)

查看this问题的已接受答案 - 它使用带有标准CheckBox的DataTemplateColumn而不是CheckBoxColumn。这为您提供单击编辑,如果您启用了行选择,它也可以使用。 HTH。

答案 1 :(得分:0)

好吧,既然没有人愿意为此提供一个好的答案:)这里有一个技巧\黑客应该做你需要的东西:

将SelectedCellsChanged事件处理程序添加到网格中:

SelectedCellsChanged="gridPersons_SelectedCellsChanged"

下面是事件处理程序的代码,它将所选单元格置于编辑模式并模拟其上的一个额外鼠标点击,这将切换复选框。

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);

private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
    public int X;
    public int Y;
}

[DllImport("user32.dll")]
static extern uint GetCursorPos(out POINT lpPoint);    

private void gridPersons_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
    // check here if this is the cell with a check box

    gridPersons.BeginEdit();

    POINT point;
    GetCursorPos(out point);
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, point.X, point.Y, 0, 0);
}

希望这有帮助,尊重