WPF ListView控件在PropertyChanged上滚动到底部

时间:2014-10-24 23:14:54

标签: c# wpf listview events scroll

我有一个名为Logger的类,它有一个ObservableCollection,它包含绑定到MainWindow类的ListView控件的所有项数据。

在Logger类中,我引发了PropertyChangedEventHandler事件,告诉UI该集合已被更新。此时我还想更新UI以将ListView滚动到底部。

我会在哪里或如何进行此操作?我正在寻找XAML控件的属性,如" OnPropertyChanged"在里面我可以做一些事情滚动到底部。

我知道在具有MainWindow实例的类中我可以简单地在LV框上使用ScrollIntoView方法,但由于我在Logger类中没有Window的实例,怎么能我实现了这一点?

如果这很简单,我很抱歉,我还处于WPF的早期阶段!

干杯, 戴夫

2 个答案:

答案 0 :(得分:2)

  1. 假设您的程序始终使用相同的ObservableCollection对象,我认为您不需要引发PropertyChangedEventHandler,因为集合是可观察的,这意味着无论何时添加/删除集合中的项目,UI方面都将相应更新。仅当您使用新的ObservableCollection对象分配Property时才需要PropertyChangedEventHandler。

  2. 要滚动到最后一项,我会听ObservableCollection的CollectionChanged事件,然后如果NotifyCollectionChangedAction是NotifyCollectionChangedAction.Add,则使用ObservableCollection中的最后一项调用listview的scrollintoview方法。注意:a。您可能需要在ScrollIntoView之前调用UpdateLayout。湾需要在CollectionChanged事件之后执行UpdateLayout / ScrollIntoView。可以使用UI的Dispatcher.BeginInvoke在事件发生后调用方法。

答案 1 :(得分:0)

可以首先为列表设置IsSynchronizedWithCurrentItem =“True”,然后使用CollectionViewSource.GetDefaultView(_yourCollection)设置observecollection的选定项目.MoveCurrentTo(selectedItem);在ViewModel中,最后在View中处理列表框的SelectionChanged事件,并调用列表框的ScrollIntoView。 另一种更直接的方法是使用行为。 这两种解决方案都在这里解释。

How to control the scroll position of a ListBox in a MVVM WPF app