Xamarin的形式滚动到BUTTOM(Xamarin forms scroll to buttom

2019-09-26 15:59发布

我创建一个Xamarin FOM的应用,在那里我将有消息随着时间快到了,我总是希望新的消息显示在我的ListView的按钮,因为它们是在未来。

目前,我的网页看起来是这样的:

 <StackLayout>
   <Button  Text="Login"  />
   <ListView  x:Name="MessageBox" ItemsSource="{Binding TempTest}" ></ListView>
   <Button Command="{Binding AddMessage}" Text="Login"/>
 </StackLayout>

我无法弄清楚如何从我的ViewModel类滚动,如何实现这一目标的任何想法?

我已经能够迄今为止找到的最好的是这样的: http://www.infinite-x.net/2014/10/30/using-the-xamarin-forms-1-3-0-listview-scrollto-方法/

但他甚至没有想到在这个阶段使用MVVM。

Answer 1:

好一个,少于优雅的方式,我想知道解决这将是一个公开Action<Message>从您的视图模型,然后你ContentPage将初始化Action ,并告诉它做滚动。 像下面的内容(只需更换Message与什么都真正型号名称是)。

内容页:

public partial class MessagePage : ContentPage {

    private MessageViewModel _viewModel;

    public MessagePage() {
        _viewModel = new MessageViewModel();

        BindingContext = _viewModel;

        _viewModel.OnMessageAdded = message => { //We tell the action to scroll to the passed in object here
            MessageBox.ScrollTo(message, ScrollToPosition.MakeVisible, true);
        }
    }
}

视图模型:

public class MessageViewModel {
    public Action<Message> OnMessageAdded { get; set; }

    public ICommand AddMessage { get; protected set; }

    private ObservableCollection<Message> _tempTest;
    public  ObservableCollection<Message> TempTest {
        get { return _tempTest ?? (_tempTest = new ObservableCollection<Message>()); }
        set {
            if(_tempTest != value) {
                _tempTest = value;
                OnPropertyChanged();
            }
        }
    }

    public MessageViewModel() {
        AddMessage = new Command(async () => {
            Message message = SomeClass.GetMessage(); //Get your object from your separate class

            TempTest.Add(message); //Add it to the list that your ListView binds to

            OnMessageAdded?.Invoke(message); //Now run the Action which, if it is not null, your ContentPage should have set to do the scrolling

            //Or if you are not using C#6:
            //Action<Message> onMessageAdded = OnMessageAdded;

            //if(onMessageAdded != null) { onMessageAdded.Invoke(message); }
        });
    }
}


文章来源: Xamarin forms scroll to buttom