Используйте checkboxcolumn, если необходимо выбрать строку сетки данных - PullRequest
2 голосов
/ 14 ноября 2009

Я использую DataGrid с CheckBoxColumn в c # 4.0. сейчас мне нужно 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 ]

2 голосов
/ 10 июля 2010

взгляните на принятый ответ на этот вопрос - он использует DataTemplateColumn со стандартным CheckBox вместо CheckBoxColumn. Это дает вам редактирование в один клик, и это также работает, если у вас включен выбор строки. НТН.

0 голосов
/ 15 ноября 2009

хорошо, так как никто не хочет дать хороший ответ для этого :) вот трюк \ хак, который должен делать то, что вам нужно:

добавить обработчик событий 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);
}

надеюсь, это поможет, с уважением

...