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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top