我无法相信在搜索谷歌和SO半小时后我找不到解决方案。
我的ViewModel中有一个ObservableCollection<string>
我的视图中的ListBox
被绑定到:
<ListBox ItemsSource="{Binding Output}" IsSynchronizedWithCurrentItem="True" />
当单击一个按钮时,新线程会执行一些操作,并且使用Observable,VM会监视从该异步操作返回的字符串,并将字符串添加到其Output
ObservableCollection
。字符串添加没有问题,但如何让视图始终显示最新项目(最近添加的项目)?
答案 0 :(得分:3)
您的商品是否显示在列表中但只是更远?如果是这种情况,您需要做的就是告诉列表将该项目滚动到视图中。您可以通过订阅ListBox.Items属性的ColllectionChanged来完成此操作。要做到这一点有点棘手,因为你必须强制转换,但你可以使用这样的代码来实现:
((INotifyCollectionChanged)MainListBox.Items).CollectionChanged += ListBox_CollectionChanged;
然后在该事件中你可以添加如下代码:
private void ListBox_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems.Count > 0)
{
Dispatcher.BeginInvoke(() =>
{
MainListBox.ScrollIntoView(e.NewItems[0]);
}, DispatcherPriority.SystemIdle);
}
}
此外,我刚刚找到了一种方法,你可以使用非常酷的附加属性来做到这一点。看看这里: http://michlg.wordpress.com/2010/01/16/listbox-automatically-scroll-currentitem-into-view/