我有一个名为Logger的类,它有一个ObservableCollection,它包含绑定到MainWindow类的ListView控件的所有项数据。
在Logger类中,我引发了PropertyChangedEventHandler事件,告诉UI该集合已被更新。此时我还想更新UI以将ListView滚动到底部。
我会在哪里或如何进行此操作?我正在寻找XAML控件的属性,如" OnPropertyChanged"在里面我可以做一些事情滚动到底部。
我知道在具有MainWindow实例的类中我可以简单地在LV框上使用ScrollIntoView方法,但由于我在Logger类中没有Window的实例,怎么能我实现了这一点?
如果这很简单,我很抱歉,我还处于WPF的早期阶段!
干杯, 戴夫
答案 0 :(得分:2)
假设您的程序始终使用相同的ObservableCollection对象,我认为您不需要引发PropertyChangedEventHandler,因为集合是可观察的,这意味着无论何时添加/删除集合中的项目,UI方面都将相应更新。仅当您使用新的ObservableCollection对象分配Property时才需要PropertyChangedEventHandler。
要滚动到最后一项,我会听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