我认为你需要调用BringIntoView
物品容器上,而不是ItemsControl的本身:
var container = DocumentElements.ItemContainerGenerator.ContainerFromItem(model) as FrameworkElement;
if (container != null)
container.BringIntoView();
编辑:其实这不工作,因为在这一点上,物品容器尚未产生...您可能可以处理ItemContainerGenerator
的StatusChanged
事件。我尝试下面的代码:
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;
}
}
但是它并没有出于某种原因要么...,ContainerFromItem
仍返回状态更改为ContainersGenerated
后空了,我不知道为什么:S
编辑:好的,我现在明白了......这是因为虚拟化:容器只有在需要显示时才会生成,因此不会为隐藏的项目生成容器。如果您关闭ItemsControl的虚拟化(VirtualizingStackPanel.IsVirtualizing="False"
),上述解决方案工作正常。
DocumentElements.ItemContainerGenerator.ContainerFromItem(model)returns null?我认为View并未更新到数据源中的新项目。 – 2009-10-23 20:33:55
啊,是的,我忘记了......但无论如何,如果容器不在ItemsControl中,你不能滚动到它:S – 2009-10-23 23:15:38
看到我更新的答案 – 2009-10-24 00:31:01