Silverlight: how to get data grid row in DataGrid by data context
Given a Silverlight data 开发者_如何学JAVAgrid, how can you find the corresponding data grid row with a specific data context?
Here's a method I have written to do this leveraging the various automationpeers:
public DataGridRow GetDataGridRowByDataContext(DataGrid dataGrid, object dataContext)
{
if (null != dataContext)
{
dataGrid.ScrollIntoView(dataContext, null);
DataGridAutomationPeer automationPeer = (DataGridAutomationPeer)DataGridAutomationPeer.CreatePeerForElement(dataGrid);
// Get the DataGridRowsPresenterAutomationPeer so we can find the rows in the data grid...
DataGridRowsPresenterAutomationPeer dataGridRowsPresenterAutomationPeer = automationPeer.GetChildren().
Where(a => (a is DataGridRowsPresenterAutomationPeer)).
Select(a => (a as DataGridRowsPresenterAutomationPeer)).
FirstOrDefault();
if (null != dataGridRowsPresenterAutomationPeer)
{
foreach (var item in dataGridRowsPresenterAutomationPeer.GetChildren())
{
// loop to find the DataGridCellAutomationPeer from which we can interrogate the owner -- which is a DataGridRow
foreach (var subitem in (item as DataGridItemAutomationPeer).GetChildren())
{
if ((subitem is DataGridCellAutomationPeer))
{
// At last -- the only public method for finding a row....
DataGridRow row = DataGridRow.GetRowContainingElement(((subitem as DataGridCellAutomationPeer).Owner as FrameworkElement));
// check this row to see if it is bound to the requested dataContext.
if ((row.DataContext) == dataContext)
{
return row;
}
break; // Only need to check one cell in each row
}
}
}
}
}
return null;
}
精彩评论