Получение нулевого свойства в шаблоне MVVM после замены свойств объектом, содержащим их - PullRequest
0 голосов
/ 16 сентября 2018

Я использую Xamarin.Forms с MVVM Pattern. То, что я пытаюсь сделать прямо здесь, это получить текст (электронная почта, пароль, подтвердить пароль) от пользователя и отправить его в viewmodel. Теперь у меня уже есть класс RegisterBindingModel.cs, который имеет эти три свойства

Так что вместо этого кода в View Model

    public string Email { get; set; }
    public string Password { get; set; }
    public string ConfirmPassword { get; set; }

Я использовал этот код

public RegisterBindingModel RegisterBindingModel { get; set; }

Но я получаю нулевое значение RegisterBindingModel при отладке после этого редактирования.

Содержание страницы xaml И строка BindingContext="{Binding RegisterBindingModel} была удалена из тега размещения стека

        <StackLayout HorizontalOptions="CenterAndExpand">
        <Label Text="Register Now! "/>
        <StackLayout BindingContext="{Binding RegisterBindingModel}">
            <Entry Text="{Binding Email}" Placeholder="Email" />
            <Entry Text="{Binding Password}" IsPassword="True" Placeholder="Password" />
        <Entry Text="{Binding ConfirmPassword}" IsPassword="True" Placeholder="ConfirmPassword" />
            </StackLayout>
        <Button Text="Register" Command="{Binding RegisterCommand}" />
    </StackLayout>

И в Registerpage.xaml.cs я использовал эту строку кода:

  BindingContext = new RegisterViewModel(Navigation);

и класс RegisterBindingModel:

public class RegisterBindingModel
{
    public string Email { get; set; }
    public string Password { get; set; }
    public string ConfirmPassword { get; set; }
}

Запрошенное редактирование

        private async void Register()
    {
        var isSuccess = await _identityService.RegisterAsync(RegisterBindingModel);
    }

Так что же пошло не так после того, как я изменил код?

1 Ответ

0 голосов
/ 17 сентября 2018

сначала давайте обновим вашу RegisterBindingModel.нам нужно добавить приватные поля, где будут храниться данные.Открытые свойства, которые вы используете для привязки, будут устанавливать / получать эти данные.Причина, по которой мы хотим сделать это в MVVM, заключается в том, что мы можем использовать преимущества двусторонней привязки.В будущем, если вы хотите установить значения этих полей на что-то и обновить представление.Это будет полезно.это также поможет объединить ваш код привязки обновлений к установщикам свойств.

public class RegisterBindingModel : BindableBase
{
    private string _email;
    public string Email { 
        get{
            return this._email;
        }
        set{
            if ( !string.IsNullOrEmpty(value) )
            {
                SetProperty(ref this._email, value);
            }
        }
    }

    private string _password;
    public string Password {
        get{
            return this._password;
        }
        set{
            if ( !string.IsNullOrEmpty(value) )
            {
                SetProperty(ref this._password, value);
            }
        }
    }

    private string _confirmPassword;
    public string ConfirmPassword {
        get{
            return this._confirmPassword;
        }
        set{
            if ( !string.IsNullOrEmpty(value) )
            {
                SetProperty(ref this._confirmPassword, value);
            }
        }
    }
}

Далее, вы решили, собираетесь ли вы использовать MVVM-фреймворк (т. Е. PRISM, MVVMCross и т. Д.), Есть много чего.Это зависит от личных предпочтений.Я неравнодушен к ПРИЗМЕ.В Prism есть классы ViewmodelBase и BindableBase, которые вы можете расширить для своих моделей представления.Он уже реализует интерфейс INotifyPropertyChanged.

Как уже упоминалось, обновите свой RegisterViewModel.

public class RegisterViewModel : BindableBase
{
    private RegisterBindingModel _registerBindingModel;
    public RegisterBindingModel RegisterBindingModel 
    {
        get
        {
            return this._registerBindingModel;
        }
        set{
            SetProperty(ref this._registerBindingModel, value);
        }
    }

    public RegisterViewModel(INavigationService navigationService)
    {
        //...
        this.RegisterBindingModel = new RegisterBindingModel();
    }
}
...