MvvmCross对象数据绑定

时间:2017-10-28 10:32:26

标签: xamarin.android mvvmcross

我是MvvmCross的新手,我对Android中的绑定有疑问。我可以绑定到单个属性但无法将数据绑定到对象。不确定我做错了什么,但现在是:

模特课程:

 public class Login : MvxNotifyPropertyChanged
{
    private string _email;

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

    public string Password { get; set; }
}

视图模型类的片段:

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);
        }
    }

}

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" />

我哪里出错了,我已经设置了一个断点但是没有看到它被击中。这绑定到EditText但似乎没有任何事情发生。我是否因为绑定到对象属性而丢失或做错了什么?

1 个答案:

答案 0 :(得分:2)

  

MvvmCross对象数据绑定

您可以实现MvxNotifyPropertyChanged接口,以便系统可以通知客户端属性值已更改。

将您的对象修改为:

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

MainViewModel

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

然后在axml

中使用它
local:MvxBind="Text Login.Email" 

它在我身边很好。

更新:

我无法重现您的问题,但这是我的完整代码,希望这可以帮助您:

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