Mvvm Xamarin表单滚动到buttom
我正在创建一个Xamarin foms应用程序,在这个应用程序中,随着时间的推移,我会收到消息,我总是希望新消息在传入时显示在我的ListView按钮上 目前,我的页面如下所示: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
<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很高兴这有帮助。