Credo che è necessario chiamare BringIntoView
sul contenitore oggetto, non l'ItemsControl stesso:
var container = DocumentElements.ItemContainerGenerator.ContainerFromItem(model) as FrameworkElement;
if (container != null)
container.BringIntoView();
EDIT: in realtà questo non lo fa lavoro, perché a questo punto, il contenitore dell'elemento non è stato ancora generato ... Probabilmente potresti gestire l'evento StatusChanged
dello ItemContainerGenerator
. Ho provato il seguente codice:
public static class ItemsControlExtensions
{
public static void BringItemIntoView(this ItemsControl itemsControl, object item)
{
var generator = itemsControl.ItemContainerGenerator;
if (!TryBringContainerIntoView(generator, item))
{
EventHandler handler = null;
handler = (sender, e) =>
{
switch (generator.Status)
{
case GeneratorStatus.ContainersGenerated:
TryBringContainerIntoView(generator, item);
break;
case GeneratorStatus.Error:
generator.StatusChanged -= handler;
break;
case GeneratorStatus.GeneratingContainers:
return;
case GeneratorStatus.NotStarted:
return;
default:
break;
}
};
generator.StatusChanged += handler;
}
}
private static bool TryBringContainerIntoView(ItemContainerGenerator generator, object item)
{
var container = generator.ContainerFromItem(item) as FrameworkElement;
if (container != null)
{
container.BringIntoView();
return true;
}
return false;
}
}
Tuttavia non funziona o ... per qualche ragione, ContainerFromItem
restituisce ancora nulla dopo lo stato passa a ContainersGenerated
, e non ho idea del perché: S
MODIFICA: OK, ho capito ora ... questo era a causa della virtualizzazione: i contenitori vengono generati solo quando devono essere visualizzati, quindi non vengono generati contenitori per oggetti nascosti. Se si disattiva la virtualizzazione per ItemsControl (VirtualizingStackPanel.IsVirtualizing="False"
), la soluzione sopra funziona correttamente.
fonte
2009-10-23 20:07:44
DocumentElements.ItemContainerGenerator.ContainerFromItem (modello) restituisce null? Non penso che la Vista sia stata ancora aggiornata al nuovo elemento nell'origine dati. –
ah, sì, ho dimenticato che ... ma comunque, se il contenitore non è ancora in ItemsControl, non è possibile scorrere ad esso: S –
vedere la mia risposta aggiornata –