WPF datagrid Выбранная строка щелкнул событие? - PullRequest
34 голосов
/ 25 июня 2010

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

Как вы думаете, возможно ли захватить этособытие как-то?

Ответы [ 5 ]

49 голосов
/ 25 июня 2010

вы можете добавить обработчик событий в ItemContainerStyle (это стиль, применяемый к строке):

<DataGrid ... >
    <DataGrid.ItemContainerStyle>
        <Style TargetType="DataGridRow">
            <EventSetter Event="MouseDoubleClick" Handler="Row_DoubleClick"/>
        </Style>
    </DataGrid.ItemContainerStyle>
    ...
</DataGrid>

Затем в обработчике вы можете проверить, выбрана ли строка

private void Row_DoubleClick(object sender, MouseButtonEventArgs e)
{
    // execute some code
}
16 голосов
/ 08 апреля 2015

Этот вопрос возник у меня при поиске решения, и ответы не сработали из-за возраста или из-за моей собственной реализации.В любом случае, вот решение, которое сработало для меня.

Добавьте событие MouseDoubleClick в DataGrid

        <DataGrid x:Name="DatagridMovie"
              Width="Auto"
              CanUserAddRows="False"
              CanUserDeleteRows="True"
              IsReadOnly="true"
              ItemsSource="{Binding}"
              MouseDoubleClick="Row_MouseDoubleClick">

и в методе

private void Row_MouseDoubleClick(object sender, MouseButtonEventArgs e)
                {                
                    // Ensure row was clicked and not empty space
                    DataGridRow row = ItemsControl.ContainerFromElement((DataGrid)sender, e.OriginalSource as DependencyObject) as DataGridRow;
                    if ( row == null ) return;

                    ...
                    Stuff();
                }

Пока что яне заметил никаких проблем с этим.Это не разделяет проблему, которая есть у других, это означает, что двойной щелчок по заголовку или пустому пространству с заранее выбранной строкой все равно вызовет ее запуск.

4 голосов
/ 08 сентября 2015

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

private void datagrid_CurrentCellChanged(object sender, EventArgs e)
    {
        int selected_index = datagrid.SelectedIndex + 1;
        // this is used for debugging and testing.
        //MessageBox.Show("The index of the row for the clicked cell is " + selected_index);

    }
0 голосов
/ 02 июня 2018

У ItemContainerStyle нет лучшего решения, рекомендуем использовать RowStyle:

В вашем XAML:

<DataGrid.RowStyle>
    <Style TargetType="DataGridRow">        
        <EventSetter Event="MouseDoubleClick" Handler="DataGridRow_MouseDoubleClick"/>
    </Style>
</DataGrid.RowStyle>

В вашем коде:

private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    //your logic here
}
0 голосов
/ 25 июня 2010

Почему бы вам не получить свойство SelectedRow во время события DoubleClick и что-то с ним сделать? Если значение SelectedRow равно нулю, это означает, что строка не выбрана, поэтому просто верните

private void Grid_DoubleClick(object sender, RoutedEventArgs e)
{
    if(grid.SelectedRow == null)
        return; // return if there's no row selected

    // do something with the Selected row here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...