我有一个 ListView,它的 ItemSource 绑定到一个 ObservableCollection。该集合存储了一些用户的聊天消息列表。现在,每当该用户收到新的聊天消息时,我想将该项目移到顶部。同样在 WhatsApp 和 slack 应用程序中。所以我想知道这样做的正确方法是什么。现在我正在从列表中删除一个项目,然后将它添加到第 0 个索引,但这样有时我会遇到参数不正确的问题。那么有什么方法可以让我直接将任何聊天移到顶部而不删除它。
列表视图的 Xaml 代码如下:
<ListView MaxHeight="{x:Bind ViewModel.OpenedChatMaxHeight, Mode=OneWay}"
Margin="0,10,0,0"
CanDragItems="True"
Loaded="{x:Bind ViewModel.OpenedChatDataLoaded}"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
SelectedIndex="{x:Bind ViewModel.OpenChatListSeletedItem,Mode=TwoWay}"
ItemsSource="{x:Bind ViewModel.OpenChatList,Mode=TwoWay}"
SelectionChanged="{x:Bind ViewModel.ChatSelected}"
IsItemClickEnabled="True"
ItemClick="{x:Bind ViewModel.OpenPinnedChatListItemClick}">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel ItemsUpdatingScrollMode="KeepItemsInView" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
答案 0 :(得分:1)
ObservableCollection<T>
类有一个 Move 方法,您可以使用该方法将项从一个索引移动到另一个索引:
OpenedChatMaxHeight.Move(oldIndex, 0);
这比在索引 0 处手动删除和添加项目更方便。
答案 1 :(得分:0)
我尝试过 Move 方法,但在那种情况下,我总是得到索引超出范围错误,我的视图只是失去了焦点。
Move
方法会将指定索引处的项目移动到集合中的新位置。请添加调试点以检查 oldIndex
是否正确。上面的问题看起来你没有得到正确的oldindex。
是否有在列表视图中将项目移至顶部的功能
为了固定顶部的图表项,我们经常制作单独的顶部列表。当您想要修复图表项时,您可以将其从之前的图表列表中移除,并将其添加到顶部列表中。
通过这种方式,很容易制作一个 istop 样式,但不能为以前的列表制作 datatemplete 选择器。您还可以将 itop 图表项存储在本地存储中以提高渲染性能。