Хорошее решение для валидации в формах Xamarin? - PullRequest
0 голосов
/ 31 октября 2019

Я ищу элегантное решение для проверки формы.

Я нашел это Проверка в корпоративных приложениях , но она не работает с классами.

Текущийрешение:

public class ItemModel
{
    [Required]
    public string UserName { get; set; }
    [Required]
    public string Password { get; set; }
}

public class NewItemViewModel : BaseViewModel
{
    private ValidatableObject<string> _userName = new ValidatableObject<string>();
    public ValidatableObject<string> UserName
    {
        get => _userName;
        set => SetProperty(ref _userName, value);
    }

    private ValidatableObject<string> _password = new ValidatableObject<string>();
    public ValidatableObject<string> Password
    {
        get => _password;
        set => SetProperty(ref _password, value);
    }

    public NewItemViewModel()
    {
        AddValidations();
    }

    public void Save(){
        var itemModel = new ItemModel { UserName = UserName.Value, Password = Password.Value };
        //TODO do something
    }

    private void AddValidations()
    {
        _userName.ValidationRules.Add(new IsNotNullOrEmptyRule<string> { ValidationMessage = "A username is required." });
        _password.ValidationRules.Add(new IsNotNullOrEmptyRule<string> { ValidationMessage = "A password is required." });
    }
}

Я хотел бы указать проверку только для модели и иметь возможность проверки по полям в View, ViewModel.

1 Ответ

0 голосов
/ 04 ноября 2019

Я сделал это, но это все еще модель для просмотра.

Преимущество заключается в том, что проверка связана с моделью, а не с представлением.

Необходимо будет преобразоватьмодель для спины.

public class ItemModel : ObservableObject
{
    private ValidatableObject<string> _userName = new ValidatableObject<string>();
    public ValidatableObject<string> UserName
    {
        get => _userName;
        set => SetProperty(ref _userName, value);
    }

    private ValidatableObject<string> _password = new ValidatableObject<string>();
    public ValidatableObject<string> Password
    {
        get => _password;
        set => SetProperty(ref _password, value);
    }

    public ItemModel(string userName, string password)
    {
        UserName.Value = userName;
        Password.Value = password;
        AddValidations();
    }

    public bool Validate()
    {
        var isValidUserName = ValidateUserName();
        var isValidPassword = ValidatePassword();
        return isValidUserName && isValidPassword;
    }

    public bool ValidateUserName()
    {
        return _userName.Validate();
    }

    public bool ValidatePassword()
    {
        return _password.Validate();
    }

    private void AddValidations()
    {
        _userName.ValidationRules.Add(new IsNotNullOrEmptyRule<string> { ValidationMessage = "A username is required." });
        _password.ValidationRules.Add(new IsNotNullOrEmptyRule<string> { ValidationMessage = "A password is required." });
    }
}

public class NewItemViewModel : BaseViewModel
{
    public ItemModel ItemModel { get; set; }

    public NewItemViewModel()
    {
        Title = "New ItemModel";
        ItemModel = new ItemModel("Username", "P@ssword");
    }

    public ICommand SaveCommand => new AsyncCommand(Save);

    private async Task Save()
    {
        if (ItemModel.Validate())
        {
            var itemModel = new ItemModel(ItemModel.UserName.Value, ItemModel.Password.Value);
            await Application.Current.MainPage.DisplayAlert("Item", $"{itemModel.UserName} {itemModel.Password}", "Ok");
        }
    }

    public ICommand ValidateUserNameCommand => new Command(() => ItemModel.ValidateUserName());

    public ICommand ValidatePasswordCommand => new Command(() => ItemModel.ValidatePassword());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...