Xamarin.android MvvmCross对象数据绑定

Xamarin.android MvvmCross对象数据绑定,xamarin.android,mvvmcross,Xamarin.android,Mvvmcross,我是MvvmCross的新手,我对Android中的绑定有一个问题。我可以绑定到单个属性,但无法将数据绑定到对象。不确定我做错了什么,但这里是: 型号类别: public class Login : MvxNotifyPropertyChanged { private string _email; public string Email { get { return _email; } set {

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

}
<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" />
公共类LoginOptionViewModel:MvxViewModel
{
专用只读IMvxNavigationService\u navigationService;
公共LoginOptions视图模型(IMvxNavigationService navigationService)
{
_导航服务=导航服务;
后勤命令=
新的MvxAsyncCommand(async()=>await\u navigationService.Navigate());
}
公共imvxancommand LoginCommand{get;set;}
私人登录_loginInfo;
公共登录信息
{
得到
{
返回_loginInfo??新登录();
}
设置
{
_loginInfo=值;
RaisePropertyChanged(()=>LoginInfo);
}
}
}
Android Axml的片段:

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

}
<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,但似乎什么也没有发生。为了绑定到对象属性,我是否丢失或做了一些错误的事情

MvvmCross对象数据绑定

您可以实现
MvxNotifyPropertyChanged
接口,这样系统就可以通知客户端某个属性值已更改

将对象修改为:

public class Login : MvxNotifyPropertyChanged
{
    private string _email;
    public string Email
    {
        get => _email;
        set => SetProperty(ref _email, value);
    }
}
主视图模型中

private Login _login;
public Login Login
{
    get
    {
        return _login ?? new Login() { Email = "=-="};
    }
    set
    {
        _login = value;
        RaisePropertyChanged(() => Login);
    }
}
local:MvxBind="Text Login.Email" 
然后在
axml
中使用它:

private Login _login;
public Login Login
{
    get
    {
        return _login ?? new Login() { Email = "=-="};
    }
    set
    {
        _login = value;
        RaisePropertyChanged(() => Login);
    }
}
local:MvxBind="Text Login.Email" 
对我来说效果很好

更新:

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

}
<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" />
我无法重现您的问题,但这是我的完整代码,希望这能帮助您:

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

.

您好,谢谢您的反馈,我已经做了您提到的事情,但仍然不起作用?提到我有一个单独的模型解决方案,这是否有帮助?同样在viewmodel上,如果我为Email=“=-=”设置了一个类似于您的属性,它会因为某种原因中断应用程序。@helloworld,我已经更新了我的答案,您可以检查一下。我感觉这是由于单独的解决方案,无法保存MVVM的相同引用。我想我会把域放在同一个解决方案中,它最有可能工作,那么你介意分享你的项目吗,以确保我们正在验证你正在使用的完全相同的东西吗?我注意到它正在工作,即,如果我在登录类的属性Email中放置断点,它会引发事件,断点确实命中。然而,当我将断点放在Login对象上时,为什么ViewModel类中的断点不起作用?