Xamarin.android MvvmCross对象数据绑定
我是MvvmCross的新手,我对Android中的绑定有一个问题。我可以绑定到单个属性,但无法将数据绑定到对象。不确定我做错了什么,但这里是: 型号类别: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 {
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类中的断点不起作用?