1

Nous avons un problème pour mettre au point une cellule de DataGrid après que ses données de collection bornée aient été actualisées. par exemple, nous définissons un filtre pour sa collection, puis nous voulons recentrer une cellule stockée de colonne stockée.Est-ce que ScrollIntoView est synchronisé dans virtualstackpannel (en particulier dans WPF DataGrid)?

Est-il vrai que nous pensons qu'un appel à ScrollIntoView est synchronisé, cela signifie que, après l'appel, notre ligne et cellule souhaitées sont créées et que nous pouvons définir le focus? (Encore une fois, cela signifie après que nous appelons à ScrollIntoView, est-il vrai que nous pensons que Itemsgenerator a terminé ses travaux et nous pouvons trouver hargneux notre cellule souhaitée)

$

//set filter of DataGrid Collection 
DataGrid_Standard.ScrollIntoView(rowNumber,cellNumber); 
//we sure our desired cell are created now 
    DataGridRow row =   (DataGridRow)DataGrid_Standard.ItemContainerGenerator.ContainerFromIndex(index); 
    if (row == null) 
    { 
     // may be virtualized, bring into view and try again 
     DataGrid_Standard.ScrollIntoView(DataGrid_Standard.Items[index]); 
     row = (DataGridRow)DataGrid_Standard.ItemContainerGenerator.ContainerFromIndex(index); 
    } 


     DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer); 

     // try to get the cell but it may possibly be virtualized 
     DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 

      // now try to bring into view and retreive the cell 
      DataGrid_Standard.ScrollIntoView(rowContainer, DataGrid_Standard.Columns[column]); 
      cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);    cell.focus(); 

Related

+0

Toute idée serait très utile – Mojtaba

Répondre

0

Voici une sélection de DataGrid gestionnaire d'événements modifié qui déplace une ligne virtualisée dans la vue, puis définit le focus sur cette ligne. Cela fonctionne pour moi:

 private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     DataGrid dg = (DataGrid)sender; 
     if (dg.SelectedItem == null) return; 
     dg.ScrollIntoView(dg.SelectedItem); 

     DataGridRow dg_row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromItem(dg.SelectedItem); 
     if (dg_row == null) return; 
     dg_row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 

    } 

EDIT: En utilisant la méthode dg_row.MoveFocus a eu un effet undesriable (une colonne de cases à cocher nécessaire deux clics pour définir au lieu d'un) et cela a fonctionné mieux pour moi d'utiliser simplement

dg_row.Focus(); 
+0

merci pour votre réponse, mais la grande question est: parfois " DataGridRow dg_row = (DataGridRow) dg.ItemContainerGenerator.ContainerFromItem (dg.SelectedItem); if (dg_row == null) return ; "arrive, nous avons essayé la situation differnt malheureusement, Il semble au-dessus du code dans 99% des fois, mais parfois la ligne récupérée ou la cellule est nulle !!!!! Il semble qu'ils ne sont pas exactement synchronisés et nous n'avons pas entendu parler de ce qui se passe exactement entre le thread principal de wpf et le thread de concepteur de wpf – Mojtaba

0
Action action =() => 
     { 
     dg .ScrollIntoView(dg .SelectedItem); 

     var item = dg.ItemContainerGenerator.ContainerFromIndex(index) as DataGridRow; 
     if (item == null) return; 

     item.Focus(); 
     }; 

     Dispatcher.BeginInvoke(DispatcherPriority.Background, action); 

Cela devrait fonctionner correctement pour votre cas.