Wpf 将未实现的ListViewItem带入视图

Wpf 将未实现的ListViewItem带入视图,wpf,listview,scrollviewer,Wpf,Listview,Scrollviewer,我有一个列表视图,一开始是空的。然后我不断地向ListView添加项目。在某个时刻,所有的项目都填满了整个可用的房间,我想从那里滚动列表视图到刚刚添加的项目 通常,这可以通过调用ListViewItem.BringIntoView或ListView.ScrollIntoViewListViewItem来实现 但是,ListView绑定到ListCollectionView,其源是ViewModel项的ObservableCollection。因此,我将ViewModel项添加到该集合中。然后通过

我有一个列表视图,一开始是空的。然后我不断地向ListView添加项目。在某个时刻,所有的项目都填满了整个可用的房间,我想从那里滚动列表视图到刚刚添加的项目

通常,这可以通过调用ListViewItem.BringIntoView或ListView.ScrollIntoViewListViewItem来实现

但是,ListView绑定到ListCollectionView,其源是ViewModel项的ObservableCollection。因此,我将ViewModel项添加到该集合中。然后通过绑定创建视图项

由于项目位于可见区域之外,因此不会立即创建ListViewItem,更不用说实现了。如果滚动视图接近ListView的底部,ListViewItem将在稍后创建并实现。1 如果滚动视图位于ListVIEW的中间,它就不能工作了。 将IsVirtualization设置为false将修复该问题,因为该项随后会被创建并实现。但这显然有一些性能上的缺点

因此,我试图找到一种方法,使刚刚添加到收藏中的物品得以创建和实现,并最终进入人们的视野

有人知道如何处理这个问题吗


1如果滚动视图接近底部,则它基本上可以工作,但有一种奇怪的行为,即似乎只有其他每个ListViewItem才会进入视图。

很难根据您的问题来判断确切的问题。然而,这可能是因为Equals函数的行为。考虑这个结构:

<DockPanel>
    <Button Name="addItem" Click="addItem_Click" Content="Add new and scroll" DockPanel.Dock="Bottom"/>
    <ListView Name="sv" ScrollViewer.VerticalScrollBarVisibility="Visible">
    </ListView> 
</DockPanel>

因为Equals返回第一个项目。

虚拟化面板有一个生成项目并使其可见的方法

下面是一个包含所有相关代码的示例

public class ListView_ViewModel
{
  private CollectionViewSource _collectionViewSource;
  private ObservableCollection<ListViewItem_ViewModel> _listViewItemViewModels;
  private ListView _listView;

  private void AddItem()
  {
    var newListViewItemViewModel = new ListViewItem_ViewModel();
    _listViewItemViewModels.Add(newListViewItemViewModel);
    var indexOfNewItem = _collectionViewSource.View.Cast<ListViewItem_ViewModel>()
                           .ToList().IndexOf(newListViewItemViewModel);
    var virtualizingPanel = VisualTreeHelper.FindChild<VirtualizingPanel>(_listView);
    virtualizingPanel.BringIndexIntoViewPublic(indexOfNewItem);
  }
}

如何添加新项目?它们是什么类型的?我的意思是它们是弦吗?那很有趣。我复制了您的代码,可以验证是否看到了相同的行为。然而,在我的例子中,我添加了新的ListViewItem,这似乎会有所不同。我刚刚设置了一个测试程序,在其中我在for循环中添加了新的ListViewItem。对于item.BringIntoView,它不起作用。使用ListView.ScrollIntoViewitem,它在我的测试程序中运行良好。这当然与我在实际节目中看到的不同。但是我不认为这会有什么不同。我用ListViewItem检查代码并运行。您应该发布代码以获得进一步帮助。我可以通过设置virtualzingpanel.isvirtualization=False来修复它。我以前没想过这个。无论如何,我将不得不进一步深入研究这个问题。我还没有完全理解这里到底发生了什么。尽管如此,还是要谢谢你。根据我的最新发现,我更新了这个问题,以便更详细地描述这个问题。然而,我担心这会使你的答案过时。
private void addItem_Click(object sender, RoutedEventArgs e)
{
    if (sv.ItemsSource == null)
        sv.ItemsSource = new ObservableCollection<string>();

    string newitem = "new item";
    ((ObservableCollection<string>)sv.ItemsSource).Add(newitem);
    sv.ScrollIntoView(newitem);
} 
public class ListView_ViewModel
{
  private CollectionViewSource _collectionViewSource;
  private ObservableCollection<ListViewItem_ViewModel> _listViewItemViewModels;
  private ListView _listView;

  private void AddItem()
  {
    var newListViewItemViewModel = new ListViewItem_ViewModel();
    _listViewItemViewModels.Add(newListViewItemViewModel);
    var indexOfNewItem = _collectionViewSource.View.Cast<ListViewItem_ViewModel>()
                           .ToList().IndexOf(newListViewItemViewModel);
    var virtualizingPanel = VisualTreeHelper.FindChild<VirtualizingPanel>(_listView);
    virtualizingPanel.BringIndexIntoViewPublic(indexOfNewItem);
  }
}