I have been developing a Silverlight business application and one of the problems I have found is the “inconsistency” of the DataGrid… at least of some of its behaviors, when I click on a row, I expect that the SelectedItem (the clicked one) is set on the corresponding DataGrid property.
But it does not. at least not “always”, lets be clear maybe I’m doing something wrong but this randomness on this behavior is driving me crazy, if I click on a Grid row, it should select it and mark the SelectedItem on the corresponding property, right?
I have been doing so in the MouseLeftButtonUp of the DataGrid, so that’s what I expected but… sometimes it had it, sometimes not… bummer!
So I have been trying to detect why is this happening but could not discover it… maybe I’m wrong in any of the assumptins but meanwhile, I got a workaround that does really work :).
The following code explains it all…
void datagrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
}
}
Basically I check first If I have the SelectedItem set, sometimes it is, so then I avoid doing the following trick.
The “trick” mainly gets the originalsource that is launching the event, that is the control inside the cell of the grid, most of times it will be a TextBox. Second I get the Parent, with this I am getting to the Cell.
Note that if you have a complex structure you should set up a recursive function to go “up” until you get a reference for the cell.
From the cell you have the datacontext which is the item whe should have got from the SelectedItem property. you should cast it to the inherent type and get any value you need from it.
Also, please note that the DataContext could be caught from the first element (OriginalSource) but it’s more ellegant to get it from the Cell, and if it is a complex custom cell this also asures that it gets the DataContext properly.
And yes, it works 100% 😉
Happy coding!
PS: If somebody knows what I have done wrong or why the DataGrid.SelectedItem Property does not return the clicked item, I would be happy to hear. 🙂