I am using the Windows Community Toolkit WinUI DataGrid control. I would like to run some code when a row is clicked. How can I do that?
I have tried:
SelectionChangedevent: Only works the first time the row is clicked, as after that the same row is being selected. Also gets triggered if the row is moved to via the keyboard.CurrentCellChangedevent: Only works the first time a cell is clicked, as after that clicking the same cell does not change the current cell. (And I could not find a way to clear the current cell programmatically.)- Answers like this show how to add row event handlers via style in WPF, but this does not work in WinUI.
Any ideas?
CodePudding user response:
I ended up using the PointerReleased event. (Previously I had discarded this event as I could not figure out which row was clicked.)
<ctWinUI:DataGrid
PointerReleased="dgDesktops_PointerReleased"
...>
And to find the DataGridRow that was clicked I traverse the visual tree:
private async void dgDesktops_PointerReleased(object sender, PointerRoutedEventArgs e)
{
DataGridRow clickedRow = ViewUtils.FindParent<DataGridRow>((UIElement)e.OriginalSource);
if (clickedRow != null)
{
MyModel rowModel = (MyModel)clickedRow.DataContext;
// Do stuff
}
}
public static T FindParent<T>(DependencyObject childElement) where T : Control
{
DependencyObject currentElement = childElement;
while (currentElement != null)
{
if (currentElement is T matchingElement)
{
return matchingElement;
}
currentElement = VisualTreeHelper.GetParent(currentElement);
}
return null;
}
Not the most elegant solution, but it works :)
