如何为底部的每个新条目更新列表视图?

How to update Listview for each new entry at the bottom?

我正在制作一个带有聊天功能的应用程序,我想要实现的是对于每条新消息,底部的 Listview 更新。这是我试过的:

 private ViewModel viewModel { get; set; }
    protected override async void OnAppearing()
    {
        base.OnAppearing();
        await viewModel.Connect();
        viewModel.RefreshScrollDown = () => {
            if (viewModel.Messages.Count > 0)
            {
                Device.BeginInvokeOnMainThread(() => {

                    listMessages.ScrollTo(viewModel.Messages[viewModel.Messages.Count - 1], ScrollToPosition.End, true);
                });
            }
        };
    }

列表视图:

 <ListView
            x:Name="MessagesList"
            BackgroundColor="Transparent"
            HasUnevenRows="true"
            ItemTemplate="{StaticResource chatDataTemplateSelector}"
            ItemsSource="{Binding Messages}"
            SelectionMode="None" />

当我更改为 CollectionView 时:

      <CollectionView
            x:Name="MessagesList"
            BackgroundColor="Transparent"
            ItemTemplate="{StaticResource chatDataTemplateSelector}"
            ItemsSource="{Binding Messages}"
            ItemsUpdatingScrollMode="KeepLastItemInView"
            SelectionMode="None" />

如果您在 ItemSource 收到新消息时添加新消息,那么您可以考虑使用 CollectionView,因为它有一个现成的 属性 (ItemsUpdatingScrollMode="KeepLastItemInView") 调整滚动偏移以在添加新项目时保持显示列表中的最后一个项目。

你可以看看Control scroll position when new items are added

更新:

在列表视图中,您的 DataTemplate 可能类似于:

<ListView.ItemTemplate>
   <DataTemplate>
      <ViewCell>
        <Grid>
         ...
        </Grid>
      </ViewCell>
   </DataTemplate>
</ListView.ItemTemplate>

当你使用 collectionview 时,它会像:

<CollectionView.ItemTemplate>
  <DataTemplate>
    <Grid>
     ...
    </Grid>
  </DataTemplate>
</CollectionView.ItemTemplate>

可以参考的越多collectionview