1
給定一個Silverlight數據網格,如何找到具有特定數據上下文的相應數據網格行?Silverlight:如何通過數據上下文獲取DataGrid中的數據網格行
給定一個Silverlight數據網格,如何找到具有特定數據上下文的相應數據網格行?Silverlight:如何通過數據上下文獲取DataGrid中的數據網格行
這裏是我寫這樣做借力各種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;
}