2011-09-14 7 views

答えて

4

は、私は、様々な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; 
} 
関連する問題