【发布时间】:2011-11-14 03:22:50
【问题描述】:
我正在尝试使用 MVVM 实现 Listview 的自动滚动。我知道您可以通过调用 ScrollIntoView 来更新列表视图,但这需要我试图避免的代码。
我已将 ListView 的 ItemSource 绑定到 ObservableCollection,并希望 Listview 自动向下滚动到添加到日志中的最新项目。
<ListView ItemsSource="{Binding Log}"
SelectedIndex="{Binding SelectedLine}"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto"
Grid.Row="1">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel>
</VirtualizingStackPanel>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="VerticalContentAlignment" Value="Top" />
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="Type" Width="50">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Type}" HorizontalAlignment="Center"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
【问题讨论】:
-
作为替代方法,您可以使用“插入”而不是“添加”将新项目添加到集合的开头。有时这很有用,特别是在日志的情况下(例如 Windows 事件查看器),因为新事件显示在顶部。 That
s not exactly an answer to your question, but if this approach is justified in your case, you wont 必须做自动滚动。 -
如果它是特定于视图的,那么在 MVVM 中使用 Code-Behind 没有任何问题。例如,我经常使用代码隐藏来设置焦点、运行动画、更改控件的位置等。由于这段代码是与视图相关的,它应该运行在视图后面,而不是在具有业务逻辑的视图模型中。跨度>