2009-04-28 66 views
3

我使用ListView來顯示錯誤列表,因爲它們出現在我的應用程序中。它的行爲和外觀與Visual Studio中的錯誤列表完全相同。我想在選擇最後一個錯誤項目時添加自動滾動功能(例如,當您將插入符號放在最後時,Visual Studio的日誌窗口如何自動滾動)。將列表視圖自動滾動到最後添加的項目的最佳方式是什麼?

錯誤列表處於ObservableCollection,它被傳遞到ListView.ItemsSource這樣的:

public ObservableCollection<ErrorListItem> Items; 
... 
MyListView.ItemsSource = _Items; 

我試圖在_Items_CollectionChanged事件處理程序進行自動滾動,而是因爲這是事件的ItemsSource而不是在實際ListViewItems,這是一個痛苦,找出是否最後一個項目被選中,選擇新行,等等。這是特別困難,因爲它似乎不是立即創建ListViewItems。我設法拖延通話設置選擇這樣的最後一個項目,使其自動滾動:

void _Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    // determine the last item to select from 'e' 
    ...   

    _ItemPendingToBeScrolled = newItemToSelect; 
    ListView.SelectedItem = newItemToSelect; 


    Dispatcher.BeginInvoke(DispatcherPriority.Background, 
     (ThreadStart)delegate 
     { 
      if (_ItemPendingToBeScrolled != null) 
      { 
       ListView.ScrollIntoView(_ItemPendingToBeScrolled); 
       ItemPendingToBeScrolled = null; 
      } 
     }) 
} 

但是,這顯然不是這樣做的正確方法。另外,如果列表已被過濾(不檢查源代碼中的最後一個項目,但是ListView中的最後一個ListViewItem),我希望事情繼續工作。

添加到綁定集合後,ListViewItem被添加到ListView時,是否有方法來監聽事件?這將是捕獲的理想事件,以便正確進行自動滾動。還是有另一種技術可以使用?

回答

0

我有很多與列表框/列表視圖,和他們滾動的問題,但是,你提到鉤住ListView的更改事件,是不是因爲你可以不聽觀察集合的CollectionChanged事件? ObservableCollection比List控件更穩定,你會得到相同的通知。

如果這些事件不在UI中工作並且您沒有訪問權限,您也可以將這些事件向上冒泡,這樣您可以在不訪問實際集合的情況下對待滾動UI,只需保留對Selected您自定義EventArgs類中的項目

相關問題