【问题标题】:Automatically scroll down ListView in Xamarin在 Xamarin 中自动向下滚动 ListView
【发布时间】:2021-12-16 23:05:18
【问题描述】:

我有ListView 绑定ItemsSource(它是ObservableRangeCollection)。我想在页面出现时自动向下滚动ListView。我该怎么办?
View:

<ListView 
        x:Name="ListAdd"            
        ItemsSource="{Binding AddNewFlashcard}"
        (...)
            >
            <ListView.Behaviors>
                <(...)>
            </ListView.Behaviors>
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="models:Flashcard">
                    <ViewCell>
                        <Grid Padding="10">
                            <Frame CornerRadius="20" HasShadow="True">
                                <StackLayout VerticalOptions="Center">
                                    <Label FontSize="Large"
                                        Text="{Binding Word}"
                                   VerticalOptions="Center"/>
                                    <Label Text="{Binding Sentence}"
                                   VerticalOptions="Center"/>
                                </StackLayout>
                            </Frame>
                        </Grid>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

它是 ViewModel:

public ObservableRangeCollection<Flashcard> AddNewFlashcard { get; set; }

        public NewFlashcardVM()
        {            
            Refresh();
            AddNewFlashcard = new ObservableRangeCollection<Flashcard>(); 
        }



        public async void Refresh() 
        {
            IsBusy = true;      
            var flashcards = await FlashcardService.GetFlashcard();
            AddNewFlashcard.AddRange(flashcards);
            IsBusy = false;
        }

【问题讨论】:

标签: c# listview xamarin.forms


【解决方案1】:

调用ListView中的ScrollTo方法即可达到你想要的效果。

我写了一个小例子供大家参考。

这里是 xaml 代码:

<StackLayout>
    <Frame HeightRequest="100">
        <ListView x:Name="mytest" >
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Label Text="{Binding .}"></Label>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Frame>
</StackLayout>

后台代码如下(加载数据时,在OnAppearing方法中调用ListView的ScrollTo方法):

public partial class MainPage : ContentPage
{
    ObservableRangeCollection<string> myList;
    public MainPage()
    {
        InitializeComponent();
        myList = new ObservableRangeCollection<string>();
        myList.Add("aaa");
        myList.Add("aaa");
        myList.Add("aaa");
        myList.Add("aaa");
        myList.Add("aaa");
        myList.Add("aaa"); 
        myList.Add("bbb");
        mytest.ItemsSource = myList;
        BindingContext = this;
    }
    protected override void OnAppearing()
    {
        base.OnAppearing();
        mytest.ScrollTo(myList[myList.Count-1], ScrollToPosition.End,false);
    }
}

如果将ScrollTo的最后一个参数改为true,则会出现滑动动画

【讨论】:

  • 在 OnAppearing 中我有这个代码:protected override void OnAppearing() { base.OnAppearing(); ListAdd.ScrollTo(NewFlashcardVM.AddNewFlashcard[NewFlashcardVM.AddNewFlashcard.Count - 1], ScrollToPosition.End, false); } 我把断点放在那里,我看到 NewFlashcardVM.AddNewFlashcard.Count 等于 0。但是当我在 xaml 中编写这段代码时: &lt;Label Text="{Binding AddNewFlashcard.Count}"/&gt; 它返回我 32。我不知道我现在应该做什么。也许你有什么想法?
  • 确保数组中有值,相当于ObservableRangeCollection.Count。
  • 什么意思? OnAppearing 没有变化,一切都会出现。我是编码新手,很抱歉我的问题:)。
  • 您的阵列名称是什么?什么是 NewFlashcardVM.AddNewFlashcard?
  • NewFlashcardVM.AddNewFlashcard 是 ObservableRangeCollection (NewFlashcardVM 在 ViewModel 中并且有 ObservableRangeCollection )。
猜你喜欢
  • 2013-05-23
  • 2017-08-10
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
相关资源
最近更新 更多