WPF DataGrid переключить режим выбора и кнопку в CellTemplate

Я создаю POS-приложение, и я хочу, чтобы конечный пользователь мог иметь возможность переключения режима выбора для datagrid, т.е. они могут щелкнуть по нескольким строкам, и каждый выбранный элемент будет накапливаться в свойстве SelectedItems - также щелчок по уже выбранной строке снимет выделение строки. Я нашел этот код в другом вопросе о переполнении стека:

<DataGrid.Resources>
    <Style TargetType="{x:Type DataGridCell}">
        <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DoCheckRow" />
    </Style>
</DataGrid.Resources>

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

Это фактически дает мне то, что я хочу, в том, что касается режима выбора переключения, однако, когда я добавляю кнопку в качестве CellTemplate, команда кнопок не запускается при нажатии, потому что я устанавливаю e.Handled = true; в приведенном выше коде, который останавливает всплывающее окно событий . Могу ли я совместить и то, и другое?


person Chris Klepeis    schedule 24.08.2012    source источник


Ответы (3)


Может быть, вы можете попробовать поставить AttachedBehavior на свою кнопку? Таким образом вы извлекаете команду из изображения и обрабатываете событие щелчка в AttachedBehavior.

person Big Daddy    schedule 24.08.2012
comment
Хорошее предложение. Я попробовал прикрепленное поведение, а также просто обработал событие Click. Его не называют. - person Chris Klepeis; 24.08.2012
comment
Взгляните на это: stackoverflow.com/ questions / 2445106 / - person Big Daddy; 24.08.2012
comment
Спасибо, что указали мне правильное направление! Мне удалось решить эту проблему с помощью проверки и некоторых вспомогательных функций, чтобы найти визуального дочернего элемента / родителя. Смотри мой ответ - person Chris Klepeis; 24.08.2012

Вы также можете сделать это с помощью флажка, который будет переключать выделение соответствующей строки.

<DataGrid.RowHeaderTemplate>
   <DataTemplate>
      <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay,
                           RelativeSource={RelativeSource FindAncestor,
                           AncestorType={x:Type DataGridRow}}}"/>
   </DataTemplate>
</DataGrid.RowHeaderTemplate>
person Cebrail Erdogan    schedule 26.01.2016

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

public void DoCheckRow(object sender, MouseButtonEventArgs e)
{
    DataGridCell cell = sender as DataGridCell;
    if (cell != null && !cell.IsEditing)
    {
        DataGridRow row = VisualHelpers.TryFindParent<DataGridRow>(cell);
        if (row != null)
        {
            Button button = VisualHelpers.FindVisualChild<Button>(cell, "ViewButton");

            if (button != null)
            {
                HitTestResult result = VisualTreeHelper.HitTest(button, e.GetPosition(cell));

                if (result != null)
                {
                    // execute button and do not select / deselect row
                    button.Command.Execute(row.DataContext);
                    e.Handled = true;
                    return;
                }
            }

            row.IsSelected = !row.IsSelected;
            e.Handled = true;
        }
    }
}

Конечно, это не самое элегантное решение, но оно работает с шаблоном MVVM, который я использую.

person Chris Klepeis    schedule 24.08.2012