WPF datagrid autoscroll
-
27-10-2019 - |
Domanda
Vorrei istituire un datagrid in modo che ogni volta che un elemento viene aggiunto ai suoi ItemsSource i rotoli DataGrid verso il basso per mostrare l'ultimo elemento.
Il datagrid è all'interno di un DataTemplate, quindi non posso impostare la X:. Proprietà name e accedervi direttamente dal codebehind
Quello che ho in mente è quello di utilizzare un evento datagrid che viene generato quando si aggiunge una riga e ha il rotolo griglia stessa.
Ecco un po 'di codice pseudo che delinea come ho impostato le cose:
UI.XAML exerpt
<TabControl ItemsSource="{Binding Parents}" x:Name="ProductsTab">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Key}"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<DataGrid Margin="5" ItemsSource="{Binding Value.Children}">
<DataGrid.Columns>
<Column Column definitions removed for your sanity/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
UI.XAML.CS exerpt
public class UI
{
//Thanks to Dr. WPF for the ObservableDictionary class
public ObservableDictionary<string, Parent> Parents {get; set;}
}
Parent.CS
public class parent
{
public ObservableCollection<Child> Children {get; set;}
}
I DataGrid non sono modificabili.
Nel caso vi stiate chiedendo, ho letto il post "Come Autoscroll su WPF datagrid" il codice in quel post avrebbe funzionato per me, se sono riuscito a trovare un evento che si attiva ogni volta un elemento viene aggiunto al DataGrid ItemsSource.
Tutte le idee?
Soluzione
Unire l'idea scorrimento automatico con l'idea da questa domanda o questa discussione MSDN : invece di ascoltare l'evento di griglia per rilevare aggiunte fila, ascoltare gli eventi dal ItemsSource
Modifica: Dal momento che non vi piace quel suggerimento, si potrebbe provare aggancio LoadingRow
, ma ho il sospetto fortemente questo richiederà EnableRowVirtualization = false
per il lavoro (non ho provato). Se la vostra collezione diventa grande, spegnendo fila virutalization apre la possibilità di un grave calo di prestazioni.
Altri suggerimenti
è possibile accedere al DataGrid, anche se è in un DataTemplate, facendo un 'Cerca' nella struttura ad albero visuale: VisualTreeHelper.GetChildCount // VisualTreeHelper.GetChild, quindi verificare di nuovo il tipo fino a trovare la griglia. E si potrebbe cercare con lo stesso tipo di metodi la barra di scorrimento, e quindi è possibile collegare un gestore di eventi e utilizzare un code-behind logica.