1
votes

I am new to MvvmCross, I have a question with regards to binding in Android. I can bind to single property but unable to data bind to an object. Not sure what I am doing wrong but here it is:

Model class:

 public class Login : MvxNotifyPropertyChanged
{
    private string _email;

    public string Email
    {
        get { return _email; }
        set
        {
            SetProperty(ref _email, value);
        }
    }

    public string Password { get; set; }
}

Snippet of View Model Class:

public class LoginOptionViewModel: MvxViewModel
{

    private readonly IMvxNavigationService _navigationService;

    public LoginOptionViewModel(IMvxNavigationService navigationService)
    {
        _navigationService = navigationService;

        LoginCommand =
            new MvxAsyncCommand(async () => await _navigationService.Navigate<RegistrationViewModel>());

    }

    public IMvxAsyncCommand LoginCommand { get; set; }

    private Login _loginInfo;

    public Login LoginInfo
    {
        get
        {
            return _loginInfo ?? new Login();
        }
        set
        {
            _loginInfo = value;
            RaisePropertyChanged(() => LoginInfo);
        }
    }

}

Snippet of Android Axml:

<EditText
                android:id="@+id/loginEmailTxt"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/EmailHint"
                android:textColor="@color/darkNavy"
                android:inputType="textEmailAddress"
                local:MvxBind="Text LoginInfo.Email" />

Where am I going wrong, I have placed a breakpoint but do not see it being hit. This is binded to EditText but nothing appears to happen. Am I missing or doing something wrong in order to bind to an object property ?

1

1 Answers

2
votes

MvvmCross object data binding

You could implement the MvxNotifyPropertyChanged interface, so the system could notifies clients that a property value has changed.

Modify your object to :

public class Login : MvxNotifyPropertyChanged
{
    private string _email;
    public string Email
    {
        get => _email;
        set => SetProperty(ref _email, value);
    }
}

In the MainViewModel :

private Login _login;
public Login Login
{
    get
    {
        return _login ?? new Login() { Email = "=-="};
    }
    set
    {
        _login = value;
        RaisePropertyChanged(() => Login);
    }
}

Then use it in axml :

local:MvxBind="Text Login.Email" 

It works fine on my side.

Update :

I cant reproduce your problem, but here is my complete code, hope this can help you :

public class MainViewModel : MvxViewModel
{
    public MainViewModel()
    {
    }

    public override Task Initialize()
    {
        return base.Initialize();
    }

    public IMvxCommand ResetTextCommand => new MvxCommand(ResetText);
    private void ResetText()
    {
        Text = "Hello MvvmCross";
    }

    private string _text = "Hello MvvmCross";
    public string Text
    {
        get { return _text; }
        set { SetProperty(ref _text, value); }
    }

    private Login _login;
    public Login Login
    {
        get
        {
            return _login ?? new Login() { Email = "=-="};
        }
        set
        {
            _login = value;
            RaisePropertyChanged(() => Login);
        }
    }
}

public class Login : MvxNotifyPropertyChanged
{
    private string _email;
    public string Email
    {
        get => _email;
        set => SetProperty(ref _email, value);
    }
}

Effect.