【发布时间】:2017-10-05 03:36:00
【问题描述】:
所以我有点困惑 MVVM 架构如何帮助我以及如何在这种情况下使用它:
我正在使用 Xamarin,并在 iOS 中创建了我的视图和视图控制器作为示例。我也实现了 MVVMLight 工具包,并为视图和视图控制器创建了我的 ViewModel。
我正在创建一个登录屏幕,因此用户输入他们的用户名和密码,并通过 RaisePropertyChanged() 事件在模型中更新它们。我的问题是我需要在哪里调用函数来验证这些信息并将它们实际登录到系统中?
我已经实现了一个 RelayCommand,每当单击按钮时都会调用 ViewModel 上的一个方法,正如我在其他教程等中看到的那样,但我不确定我是否应该在这里调用验证代码。
我所拥有的一些例子:
LoginViewModel.cs:
public class LoginViewModel : ViewModelBase
{
private string _username;
private string _password;
public RelayCommand LoginButtonCommand { get; private set; }
public bool CanExecuteLoginCommand { get; set; }
public LoginViewModel()
{
LoginButtonCommand = new RelayCommand(HandleLoginButtonCommand, () => CanExecuteLoginCommand);
CanExecuteLoginCommand = true;
}
public string Username
{
get
{
return _username;
}
set
{
_username = value;
RaisePropertyChanged(() => Username);
}
}
public string Password
{
get
{
return _password;
}
set
{
_password = value;
RaisePropertyChanged(() => Password);
}
}
private void HandleLoginButtonCommand()
{
CanExecuteLoginCommand = false;
//Validate login?
CanExecuteLoginCommand = true;
}
}
LoginViewController.cs:
public partial class LoginViewController : UIViewController
{
private Binding _usernameTextFieldBinding;
private Binding _passwordTextFieldBinding;
private LoginViewModel _viewModel;
public LoginViewController(IntPtr handle) : base(handle)
{
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
_viewModel = Application.Locator.Login;
HideKeyboardHandling(UsernameTextField);
HideKeyboardHandling(PasswordTextField);
_usernameTextFieldBinding = this.SetBinding(
() => _viewModel.Username)
.ObserveSourceEvent("EditingDidEnd")
.WhenSourceChanges(() => _viewModel.Username = UsernameTextField.Text);
_passwordTextFieldBinding = this.SetBinding(
() => _viewModel.Username)
.ObserveSourceEvent("EditingDidEnd")
.WhenSourceChanges(() => _viewModel.Password = PasswordTextField.Text);
Loginbutton.SetCommand("TouchUpInside", _viewModel.LoginButtonCommand);
}
public override void DidReceiveMemoryWarning()
{
base.DidReceiveMemoryWarning();
// Release any cached data, images, etc that aren't in use.
}
void HideKeyboardHandling(UITextField textField)
{
textField.ShouldReturn = TextField =>
{
TextField.ResignFirstResponder();
return true;
};
var gesture = new UITapGestureRecognizer(() => View.EndEditing(true));
gesture.CancelsTouchesInView = false;
View.AddGestureRecognizer(gesture);
}
}
【问题讨论】:
-
我会将验证放在该视图模型方法中。
-
喜欢调用数据库来判断其是否认证?我想我应该说身份验证和验证
-
因为我认为 ViewModel 应该只处理与视图和模型有关的事情,而不是业务逻辑
-
你可以让 viewmodel 把它交给模型,如果你有的话。
-
我知道那部分我想我的问题是关于确定登录是否成功的实际身份验证过程。是否应该在 ViewController 中的单独单击处理程序中完成?还是 ViewModel 几乎充当控制器并调用这些方法