Как я могу получить DataGrid для отмены выбора при клике, когда SelectionMode = "Extended"? - PullRequest
5 голосов
/ 24 июня 2011

Поведение WPF DataGrid по умолчанию заключается в выборе при щелчке строки, если SelectionMode="Extended", что я и хочу, однако я также хочу, чтобы строка была отменена, если она уже была выбрана при нажатии.

Я попробовал следующее, чтобы отменить выбор строки, как только она выбрана, кажется, что выбор строки происходит до события щелчка мыши.

private void DoGridMouseLeftButtonUp(object sender, MouseButtonEventArgs args) {
    // Get source row.
    DependencyObject source = (DependencyObject)args.OriginalSource;
    var row = source.FindParent<DataGridRow>();
    if (row == null)
        return;
    // If selected, unselect.
    if (row.IsSelected) {
        row.IsSelected = false;
        args.Handled = true;
    }
}

Где я привязываюсь к этому событиюсо следующей сеткой.

<DataGrid SelectionMode="Extended"
          SelectionUnit="FullRow"
          MouseLeftButtonUp="DoGridMouseLeftButtonUp">

Ответы [ 2 ]

3 голосов
/ 27 июня 2011

Мне удалось решить эту проблему, вместо того, чтобы обрабатывать события в самой сетке для обработки их в ячейке, вместо этого это включает установщик событий для DataGridCell следующим образом:

<DataGrid SelectionMode="Extended"
          SelectionUnit="FullRow">
    <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridCell}">
            <EventSetter Event="PreviewMouseLeftButtonDown"
                         Handler="DoCheckRow"/>
        </Style>
    </DataGrid.Resources>
    <!-- Column mapping omitted. -->
</DataGrid>

Код обработчика событий.

public void DoCheckRow(object sender, MouseButtonEventArgs e) {
    DataGridCell cell = sender as DataGridCell;
    if (cell != null && !cell.IsEditing) {
        DataGridRow row = FindVisualParent<DataGridRow>(cell);
        if (row != null) {
            row.IsSelected = !row.IsSelected;
            e.Handled = true;
        }
    }
}

Моя сетка доступна только для чтения, поэтому любое поведение при редактировании здесь игнорируется.

0 голосов
/ 24 июня 2011

моей сети данных wpf требуется сочетание клавиш CTRL + CLICK для добавления и удаления НЕСКОЛЬКИХ строк. поэтому его стандартное поведение;) но, тем не менее, почему вы не используете событие PreviewMouseDown, а затем проверяете leftmousebutton и Ctrl, делаете логику отмены выбора и устанавливаете e.handled = true?

...