2011-03-15 102 views
3

我有一个ListBox控件,我使用ObservableCollection添加项目到我的ViewModel但是我注意到ListBox不保持滚动位置,因为我期望。Silverlight维护列表框滚动位置

我是新来的Silverlight,并选择使用MVVM,但我不知道这样做。该方案如下:

  • 获取列表框的滚动位置(需要访问XAML控制,但内部视图模型?)
  • 添加项目的ObservableCollection(做,只是通过Dispatcher.CheckBeginInvokeOnUI在视图模型,ListBox控件的ItemSource被绑定到它)。
  • 设定ListBox的滚动位置(需要再次访问XAML控制从内部视图模型?)

我发现这个答案在这里: Restoring exact scroll position of a listbox in Windows Phone 7

并且以位改变的,我认为垂直滚动位置可以获取,并通过设置:

ScrollViewer sv = TimelineTweets.Descendents().OfType<ScrollViewer>().FirstOrDefault(); 
double startOffset = sv.VerticalOffset; 
sv.ScrollToVerticalOffset(startOffset); 

但我怎么会连去这与MVVM和Silverlight在一般情况下,很迷茫。

回答

1

我会建议滚动位置是UI的东西,所以在后面的UI代码中处理它。 这不会中断MVVM,因为您仍然处理ViewModel中的所有内容。

0

您可以使用

(DataContext as VM).ScrollVOffset=sv.VerticalOffset 

您的视图中存储。其中VM是ViewModel类,ScrollVOffset是ViewModel类的属性。