我使用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;
}
})
}
但这显然不是正确的做法。此外,如果列表已过滤,我希望事情继续有效(不检查我的源中的最后一项,而是查看ListViewItem
中的最后一项ListView
)。
在添加到绑定集合后,ListViewItem
添加到ListView
时,有没有办法监听事件?这将是捕获的理想事件,以便正确地进行我的自动滚动。或者我可以使用另一种技术吗?
答案 0 :(得分:0)
我在列表框/列表视图及其滚动方面存在很多问题,但是,您提到挂钩到listview的已更改事件,是因为您无法侦听可观察集合的CollectionChanged事件? ObservableCollection比List控件更稳定,你会得到相同的通知。
如果它在UI中不起作用并且你没有访问权限,你也可以冒泡这些事件,这样你就可以在UI中处理你的滚动而无需访问实际的集合,只需保留对Selected Item的引用在您的自定义EventArgs类
中