我有一个类“ ChatListView ”,该类是从 Listview 继承的。
public class ChatListView:ListView
{
}
,并使用Cs中的ChatListView以编程方式列出了一个列表:
messageList = new ChatListView();
messageList.HasUnevenRows = true;
messageList.VerticalOptions = LayoutOptions.FillAndExpand;
messageList.SetBinding(ChatListView.ItemsSourceProperty, new Binding("Messages"));
messageList.ItemTemplate = new DataTemplate(CreateMessageCell);
我已将其绑定到我正在获取“消息”的视图模型上
Messages = new ObservableCollection<ChatMessageViewModel>(TotalMessages.Skip(TotalMessages.Count - App.PagingCount));
我需要将列表滚动到结束位置。为此,我编写了如下代码:
ViewModel.Messages.CollectionChanged += (s, ex) =>
{
Device.BeginInvokeOnMainThread(() =>
{
if (ViewModel.Messages.Any())
{
messageList.ScrollTo(ViewModel.Messages.LastOrDefault(), ScrollToPosition.End, false);
}
});
};
但这对我不起作用。我觉得列表调用或列表名称可能有问题。任何指导或帮助都可以帮助我发现我的方法出了什么问题。
答案 0 :(得分:2)
您不必在每次收到新消息时都换掉Messages
实例,而只需添加它。否则,您的整个ListView
将刷新,并且CollectionChanged
事件不会触发,因为它是一个全新的实例。
因此,当您收到消息时,请执行以下操作:
Messages.Add(newMessage);
然后CollectionChanged
事件将触发Added
事件:
ViewModel.Messages.CollectionChanged += OnCollectionChanged;
private void OnCollectionChanged(object sender, CollectionChangeEventArgs args)
{
if (args.Action == CollectionChangeAction.Add) // items were added
{
messageList.ScrollTo(ViewModel.Messages.LastOrDefault(), ScrollToPosition.End, false);
}
}
确保在构造函数中或作为属性声明的一部分实例化Messages
。
public ObservableCollection<ChatMessageViewModel> Messages { get; } = new ObservableCollection<ChatMessageViewModel>();
答案 1 :(得分:1)
尝试将ScrollToPosition.End更改为ScrollToPosition.MakeVisible
答案 2 :(得分:0)
尝试此代码..这对我有用。
if (Device.RuntimePlatform == Device.Android)
{
messageList.ScrollTo(ViewModel.Messages.LastOrDefault(), ScrollToPosition.End, false);
}
else if (Device.RuntimePlatform == Device.iOS)
{
messageList.ScrollTo(ViewModel.Messages.LastOrDefault(), ScrollToPosition.End, true);
}