2014-01-25 36 views
1

我嘗試添加一個按鈕單擊處理如下:如何滾動到結束的ListView新增的數據後 - WPF

 ListView listView = MyListView; 
     int lastItemIndex = listView.Items.Count - 1; 
     listView.ScrollIntoView(listView.Items[lastItemIndex]); 
     listView.UpdateLayout(); 

按一下按鈕也與添加項目到的ObservableCollection命令處理程序相關聯與ListView相關聯。

問題是在我的命令處理程序之前調用了按鈕單擊處理程序,因此爲時尚早。在按鈕點擊處理程序中,ListView還沒有看到更新的ObservableCollection和添加的項目。什麼事件或更好,我可以做什麼,而無需更改後面的代碼讓我的項目添加到ObservableCollection後ListView滾動到最後?我看過,但沒有在stackoverflow答案。謝謝!

回答

2

如果的ItemSource是的ObservableCollection,你可以連接到CollectionChanged事件在窗口/用戶控件的構造和滾動最後一個項目進入視野,只要項目獲得加入收藏

假設你的底層類是TesClass,這是你會怎麼做:

((INotifyCollectionChanged)listView.ItemsSource).CollectionChanged += 
    (s, e) => 
    { 
     if (e.Action == 
      System.Collections.Specialized.NotifyCollectionChangedAction.Add) 
     { 
      listView.ScrollIntoView(listView.Items[listView.Items.Count - 1]); 
     } 
    }; 
+0

大和感謝!如果方便的話,你知道是否更好地將它靠近模型類?想知道自是相當域/模型特定。關於如何用MVVM來做到這一點的想法?再次感謝。 – Buck

+0

如何使用接口,而不是'INotifyCollectionChanged'(檢查答案更新)?通過這種方式,您可以抽象出從視圖中訪問任何模型類。將它移動到ViewModel似乎也不正確,因爲我們在這裏查看特定的東西(將項目滾動到視圖中)。有了接口,我認爲它非常好。如果底層模型類從TestClass更改爲任何其他類,則不必擔心。 (當然只要你綁定到實現INotifyCollectionChanged的集合)。 –

1

試試這個

VirtualizingStackPanel vsp = (VirtualizingStackPanel)typeof(ItemsControl).InvokeMember("_itemsHost", BindingFlags.Instance | BindingFlags.GetField | BindingFlags.NonPublic, null, _listView, null); 

double scrollHeight = vsp.ScrollOwner.ScrollableHeight; 
double offset = scrollHeight * lastItemIndex // itemIndex_ is index of the item which we want to show in the middle of the view 

vsp.SetVerticalOffset(offset); 

VirtualizingStackPanel