显示添加到ItemsControl的最新项目

时间:2011-05-05 22:01:24

标签: wpf itemscontrol

我无法相信在搜索谷歌和SO半小时后我找不到解决方案。

我的ViewModel中有一个ObservableCollection<string>我的视图中的ListBox被绑定到:

<ListBox ItemsSource="{Binding Output}" IsSynchronizedWithCurrentItem="True" />

当单击一个按钮时,新线程会执行一些操作,并且使用Observable,VM会监视从该异步操作返回的字符串,并将字符串添加到其Output ObservableCollection。字符串添加没有问题,但如何让视图始终显示最新项目(最近添加的项目)?

1 个答案:

答案 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/