【问题标题】:MVVM - Where to call function on button click?MVVM - 单击按钮时在哪里调用函数?
【发布时间】: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 几乎充当控制器并调用这些方法

标签: c# ios xaml xamarin mvvm


【解决方案1】:

这完全取决于您对单一职责原则 (SPR) 的要求有多严格。这又取决于您的应用程序有多复杂。应用程序越复杂,职责应该越分离。

典型的 MVVM 实现处理 ViewModel 中的命令。 ViewModel 将调用转发到 Model。但他仍然将两个职责(例如演示和命令处理)放在一个组件中,也就是 ViewModel。

更严格的方法是让 ViewModel 只处理表示逻辑。创建一个单独的控制器来托管所有命令处理程序。并让命令处理程序将调用转发给模型。

更轻松的方法是在 ViewModel 中简单地实现业务逻辑。这意味着您没有业务逻辑层。如果您的应用程序足够简单以至于业务逻辑层不值得付出努力,这很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多