WPF datagrid выбранное событие с нажатием клавиши?
Я хочу выполнить некоторый код, когда дважды щелкнул выбранную строку WPF DataGrid. Я знаю, что datagrid имеет событие MouseDoubleClicked и что он также имеет событие, выбранное для строки, но я не вижу никакого события для "выбранной строки с двойным щелчком"...
Считаете ли вы возможным каким-то образом захватить это событие?
Ответы
Ответ 1
вы можете добавить обработчик событий в 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
}
Ответ 2
Этот вопрос подошел ко мне, ища решение, и ответы не сработали, будь то из-за возраста или моей собственной реализации. В любом случае, вот решение, которое сработало для меня.
Добавить событие 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();
}
До сих пор я не замечал никаких проблем с этим. Он не разделяет проблему, которую другие имеют, это означает, что двойной щелчок на заголовке или пустое пространство с заранее выбранной строкой все равно приведет к ее запуску.
Ответ 3
Вы можете попробовать обработчик обработчика текущей ячейки, который работает только одним кликом, а не двойным щелчком, если это то, что вы ищете, поскольку двойной щелчок может использоваться для инициирования редактирования ячейки или всей строки или для любого другого процесса:
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);
}
Ответ 4
Почему вы не получаете свойство SelectedRow во время события DoubleClick и что-то с ним делаете? Если SelectedRow имеет значение NULL, это означает, что не выбран Row, поэтому просто верните
private void Grid_DoubleClick(object sender, RoutedEventArgs e)
{
if(grid.SelectedRow == null)
return; // return if there no row selected
// do something with the Selected row here
}