我正在尝试在我的xamarin移动项目中实现MVVM模式。
我有以下用于MVVM的文件
以下是我的
LoginViewModel
public class LoginViewModel : BaseViewModel
{
private bool isLoginIndicator= false;
private string etUserName;
private string etPassword;
public LoginViewModel()
{
OnLogin = new Command(doLogin , ()=>!LoginIndicator);
MessagingCenter.Subscribe<IMessage, EventType>(this, RestApi.UI_EVENT, (sender, eventType) =>
{
LoginIndicator = false;
if (eventType.status)
{
Application.Current.MainPage.DisplayAlert(AppResources.success, "Login done", "Ok");
}
else
{
Application.Current.MainPage.DisplayAlert(AppResources.failed, eventType.errorMessage, "Ok");
}
});
}
public bool LoginIndicator
{
get { return isLoginIndicator; }
set
{
isLoginIndicator = value;
OnPropertyChanged("LoginIndicator");
OnLogin.ChangeCanExecute();
}
}
public string UserName
{
get { return etUserName; }
set
{
etUserName = value;
OnPropertyChanged("UserName");
}
}
public string Password
{
get { return etPassword; }
set
{
etPassword = value;
OnPropertyChanged("Password");
}
}
public Command OnLogin { get; }
void doLogin()
{
LoginIndicator = true;
UserRequest user = new UserRequest();
user.userName = etUserName;
user.password = etPassword;
user.companyId = "CEE";
user.appVersion = Constants.getAppVersion();
user.osVersion = Constants.getOSVersion();
user.deviceId = Constants.getDeviceModel() + " " + Constants.getDevicePlatform();
new RestApi().userLogin(JsonConvert.SerializeObject(user));
}
}
当从Button触发
OnLogin
命令并使用Message
广播MessageCenter
时,此类通常会进行网络服务调用现在,我想导航到我的
MainPage
,即用户成功登录后的母版页,因此当eventType.status
中的Message Subscriber
为true时,我需要导航到母版页但是我不知道如何根据MVVM模式正确导航到其他页面。
我尝试在网上搜索,发现有现成的框架可用,例如
MVVMCross
和MVVMLight
等。但是我不想使用那些依赖项,如果有人可以建议,我愿意以其他方式实现导航
最佳答案
MVVM并没有说明导航,因此基本上每个选项都可以。
唯一反对代码的东西是:Application.Current.MainPage = new MyFirstPageAfterLogin();
是您现在对ViewModel中的页面进行了引用,而这并不是您想要的。这就是为什么MVVM框架倾向于实现称为ViewModel-to-ViewModelnavigation的概念的原因。这样,您可以指定要导航到的ViewModel。根据框架(或实现方式)的不同,您可以先注册一个耦合或使用一个命名约定。例如;我喜欢使用FreshMvvm,它通过命名约定来实现。
因此,当我想导航到PageAfterLoginPage
时,我创建了PageAfterLoginPageModel
。现在,我可以从ViewModel(或Xamarin命名中的PageModel)导航到PageModel,而不必对页面进行硬引用。这样,Page和PageModel是分开的,如果需要,我可以轻松地换出View。
因此,可以使用已有的框架,也可以查看他们的Github存储库,看看如果您坚持要自己做的话。
关于xamarin - 在不使用现有MVVM框架的情况下使用MVVM模式进行页面导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43367444/