Mvvm Xamarin表单滚动到buttom

Mvvm Xamarin表单滚动到buttom,mvvm,xamarin.forms,Mvvm,Xamarin.forms,我正在创建一个Xamarin foms应用程序,在这个应用程序中,随着时间的推移,我会收到消息,我总是希望新消息在传入时显示在我的ListView按钮上 目前,我的页面如下所示: <StackLayout> <Button Text="Login" /> <ListView x:Name="MessageBox" ItemsSource="{Binding TempTest}" ></ListView> <Butto

我正在创建一个Xamarin foms应用程序,在这个应用程序中,随着时间的推移,我会收到消息,我总是希望新消息在传入时显示在我的ListView按钮上

目前,我的页面如下所示:

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

我不知道如何从我的ViewModel类中滚动,关于如何实现这一点有什么想法吗

到目前为止,我能找到的最好的是:


但在这个阶段,他甚至没有考虑使用MVVM

我知道解决这个问题的一个不太优雅的方法是从ViewModel中公开一个
动作
,然后你的
内容页面
将初始化该
动作
,并告诉它进行滚动。类似于以下内容(只需将
消息
替换为真正的型号名称即可)

内容页:

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); }
        });
    }
}
公共类MessageViewModel{
对消息添加{get;set;}的公共操作
公共ICommand AddMessage{get;protected set;}
私人可观测收集最具诱惑力;
公众可观察到的诱惑{
获取{return}
设置{
如果(最诱人的!=值){
_诱惑=价值;
OnPropertyChanged();
}
}
}
public MessageViewModel(){
AddMessage=新命令(异步()=>{
Message Message=SomeClass.GetMessage();//从单独的类中获取对象
testest.Add(message);//将其添加到ListView绑定到的列表中
OnMessageAdded?.Invoke(message);//现在运行操作,如果该操作不为null,则ContentPage应该设置为进行滚动
//或者如果您没有使用C#6:
//操作onMessageAdded=onMessageAdded;
//如果(onMessageAdded!=null){onMessageAdded.Invoke(message);}
});
}
}

是否尝试滚动到
按钮之一?您代码中的两个
按钮都在
列表视图的外部,因此它们无法滚动到。我的按钮有一个绑定到另一个类的命令,我从该类向我的视图添加新消息。添加邮件后,我想滚动视图,以便看到完整的邮件(不管我添加到滚动视图的邮件数是多少),您的意思是滚动到按钮还是底部?我最后使用了类似于您推荐的内容,谢谢@BenjaminKarlog很高兴这有帮助。