我認爲你需要調用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