2009-10-23 62 views
7

我有一個ItemsControl,它的數據綁定爲ObservableCollection。我在後面的代碼中添加了一個新的模型。然後,我想將新項目(在列表的底部)滾動到視圖中。將ItemsControl中的新項目滾動到視圖中

我認爲ItemsControl的尺寸在我查詢尺寸時尚未更新,因爲ActualHeight在添加模型之前和之後都是相同的。此代碼的效果是滾動到略高於新項目的點。

我怎麼知道新的ActualHeight將會是什麼?

這裏是我的代碼:

 ViewModel.CreateNewChapter(); 
     var height = DocumentElements.ActualHeight; 
     var width = DocumentElements.ActualWidth; 
     DocumentElements.BringIntoView(new Rect(0, height - 1, width, 1)); 

回答

5

我認爲你需要調用BringIntoView物品容器上,而不是ItemsControl的本身:

var container = DocumentElements.ItemContainerGenerator.ContainerFromItem(model) as FrameworkElement; 
if (container != null) 
    container.BringIntoView(); 

編輯:其實這不工作,因爲在這一點上,物品容器尚未產生...您可能可以處理ItemContainerGeneratorStatusChanged事件。我嘗試下面的代碼:

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"),上述解決方案工作正常。

+0

DocumentElements.ItemContainerGenerator.ContainerFromItem(model)returns null?我認爲View並未更新到數據源中的新項目。 – 2009-10-23 20:33:55

+0

啊,是的,我忘記了......但無論如何,如果容器不在ItemsControl中,你不能滾動到它:S – 2009-10-23 23:15:38

+0

看到我更新的答案 – 2009-10-24 00:31:01

相關問題