有没有办法让ListView保持垂直滚动,因为数据是通过绑定到ListView的ItemsSource属性来更新的?我似乎无法在ListView或其底层GridView控件中找到属性来实现所需的结果。我希望它滚动,以便用户始终可以看到最新信息。当行添加到控件但未显示最新的行时,滚动条已经显示。
我应该考虑使用具有自动滚动功能的其他类型的控件吗?我只有两列:一列包含DateTimes,另一列包含一个简单的字符串。我开始认为我的控制选择可能太有限了。
我的XAML看起来大致如下:
<ListView ItemsSource="{Binding Updates}">
<ListView.View>
<GridView>
<GridViewColumn Header="Timestamp" DisplayMemberBinding="{Binding TimeStamp}"/>
<GridViewColumn DisplayMemberBinding="{Binding UpdateString}" />
</GridView>
</ListView.View>
</ListView>
答案 0 :(得分:2)
我发现要公开ListView
的ScrollViewer对象来操纵滚动。我的DataContext
包含一个派生自ObservableCollection
的集合,后面的代码中我将一个事件处理程序连接到CollectionChanged
事件。我使用Decorator
来展示ListView
(边框)的第一个孩子,它的孩子是ScrollViewer
。从那里我调用ScrollToBottom()
方法来达到理想的行为。
在包含ListView
的视图背后的代码中,这就是它的编码方式
MyViewModel viewModel = DataContext as MyViewModel;
viewModel.MyCollection.CollectionChanged += (sender,e) =>
{
if(e.NewItems != null)
{
Decorator border = VisualTreeHelper.GetChild(SummaryListView, 0) as Decorator;
ScrollViewer scroll = border.Child as ScrollViewer;
scroll.ScrollToBottom();
}
};
我找到了如何在Anshulee's WindowsClient blog post上公开ScrollViewer
。
修改强>
以前,我正在检查是否满足自定义集合中的最大项目数,然后滚动到底部。对于不同的屏幕分辨率,这不能很好地工作,因为应用程序可能在一台机器上的ListView
中显示15行,而在另一台机器上显示25行。所以现在我总是将它滚动到底部以显示最新项目。
答案 1 :(得分:1)
你应该使用一个scrollviewer对象,它会在需要时自动滚动它的内容(你也可以指定你是否总是想要水平或垂直滚动,无论它是否需要,以及其他一些东西)
<ScrollViewer>
<GridView>
<!-- gridview definition -->
<GridView>
</ScrollViewer>
的更多信息
答案 2 :(得分:0)
我非常确定VirtualizingStackPanel
正在被使用......这意味着这些项目在需要之前不存在。因此,如果您有15000个项目,那么在需要之前渲染这15000个项目是没有意义的。
更简单的方法可能是强制排序,以便最新数据保持在顶部。然后它会给你推送项目的外观,但它们将是最旧的项目,因此滚动查看它们无关紧要,除非用户启动它。
答案 3 :(得分:0)
Listview有一个名为ScrollIntoView(object item)
的方法。
这会将Listview滚动到指定项目所在的位置。
如果您有一个绑定到Listview的集合,则可以在集合发生更改时调用此方法,例如:
private void myCollectionChanged()
{
myListView.ScrollIntoView(myCollection.Last());
}