Creo que es necesario llamar a BringIntoView
en el envase artículo, no el propio ItemsControl:
var container = DocumentElements.ItemContainerGenerator.ContainerFromItem(model) as FrameworkElement;
if (container != null)
container.BringIntoView();
EDIT: en realidad este no lo hace trabajo, porque en este punto, el contenedor de elementos aún no se ha generado ... Probablemente podría manejar el evento StatusChanged
del ItemContainerGenerator
. He intentado el siguiente código:
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;
}
}
Sin embargo, no funciona bien ... por alguna razón, todavía ContainerFromItem
devuelve NULL después de los cambios de estado a ContainersGenerated
, y no tengo ni idea de por qué: S
EDITAR: OK, ahora entiendo ... esto fue por la virtualización: los contenedores se generan solo cuando deben mostrarse, por lo que no se generan contenedores para elementos ocultos. Si desactiva la virtualización para ItemsControl (VirtualizingStackPanel.IsVirtualizing="False"
), la solución anterior funciona bien.
DocumentElements.ItemContainerGenerator.ContainerFromItem (model) devuelve nulo? No creo que la Vista se haya actualizado aún al nuevo elemento en la fuente de datos. –
ah, sí, me olvidé de eso ... pero de todos modos, si el contenedor aún no está en ItemsControl, no puede desplazarse a él: S –
ver mi respuesta actualizada –