Xamarin.android 如何在Android+;MVVMCross
我有一个非常简单的应用程序,它依赖于MVVMCross+Xamarin Android 我已经能够创建一个WP8应用程序LoginView(用户名+密码+提交按钮),它绑定到ViewModel中带有参数(将是我的密码)的Cmd。现在我试着用Android做同样的事情。如何在我的LoginView的axml文件中表示CommandParameter(视图的另一个字段)Xamarin.android 如何在Android+;MVVMCross,xamarin.android,mvvmcross,Xamarin.android,Mvvmcross,我有一个非常简单的应用程序,它依赖于MVVMCross+Xamarin Android 我已经能够创建一个WP8应用程序LoginView(用户名+密码+提交按钮),它绑定到ViewModel中带有参数(将是我的密码)的Cmd。现在我试着用Android做同样的事情。如何在我的LoginView的axml文件中表示CommandParameter(视图的另一个字段) public class LoginViewModel : MvxViewModel { private read
public class LoginViewModel : MvxViewModel
{
private readonly ILoginService _loginService;
public LoginViewModel(ILoginService loginService)
{
_loginService = loginService;
}
private string _username;
public string Username
{
get { return _username; }
set { _username = value; RaisePropertyChanged(() => Username); }
}
private string _error;
public string Error {
get { return _error; }
set { _error = value; RaisePropertyChanged(() => Error); }
}
#region LoginCmd
private MvxCommand<string> _loginCmd;
public ICommand LoginCmd
{
get
{
_loginCmd = _loginCmd ?? new MvxCommand<string>(DoLoginCmd);
return _loginCmd;
}
}
private void DoLoginCmd(string password)
{
try
{
_loginService.Login(Username, password);
ShowViewModel<ProjectsListViewModel>();
}
catch (SecurityException ex)
{
Error = ex.Message;
}
}
#endregion
}
公共类LoginViewModel:MvxViewModel
{
专用只读ILoginService(U loginService);
公共登录视图模型(ILoginService登录服务)
{
_loginService=loginService;
}
私有字符串\u用户名;
公共字符串用户名
{
获取{return\u username;}
设置{u username=value;RaisePropertyChanged(()=>username);}
}
私有字符串_错误;
公共字符串错误{
获取{return\u error;}
设置{u error=value;RaisePropertyChanged(()=>error);}
}
#区域后勤
私有MvxCommand loginCmd;
公共ICommand LoginCmd
{
得到
{
_loginCmd=_loginCmd??新MVX命令(DoLoginCmd);
返回_loginCmd;
}
}
私有void DoLoginCmd(字符串密码)
{
尝试
{
_loginService.Login(用户名、密码);
ShowViewModel();
}
catch(SecurityException-ex)
{
错误=例如消息;
}
}
#端区
}
有关常规命令参数绑定,请参见
对于绑定到视图中的某个值,我的一般回答是不要
MvvmCross不支持ElementName或RelativeSource类型绑定源
相反,所有绑定都指向ViewModel/DataContext
对于您的应用程序示例,您可以轻松地将密码绑定到ViewModel中的属性,就像您对用户名所做的那样
评论讨论后更新 如果出于Xaml安全考虑,
Password
是一个特例,那么您可以尝试以下选项:
- 您可以使用AttachedProperties解决这些安全问题-有关详细信息,请参阅类似的链接
- 您可以在Android和iOS上绑定
属性,然后使用绑定语法将Click事件与ViewModel绑定的CommandParameter绑定—类似于Password
Click CommandParameter(LoginCmd,Password)
- 您可以使用基于ViewModel的逻辑来使用传入密码的参数或(为空时)ViewModel密码属性(
)Password=Password??Password;
- 您可以使用代码隐藏或自定义控件绑定技巧使命令参数正常工作。。。e、 g.你可以:
- 从按钮继承登录按钮
- 将
方法添加到LoginButtonSetPasswordEditText(EditText)
- 将
ICommand属性添加到LoginButton并使其启动PasswordClick
- 使用少量代码连接UI,以便在命令时提供密码
- 这看起来像
公共类登录按钮:按钮
{
公共登录按钮(上下文c,IAttributeSet a):基本(c,a){
点击+=(s,e)=>{
如果(LoginClick==null)返回;
if(PasswordEditText==null)返回;
if(LoginClick.CanExecute(PasswordEditText.Text))
LoginClick.Execute(PasswordEditText.Text);
}
}
公共ICommand登录单击{get;set;}
公共EditText密码EditText{get;set;}
}
//OnCreate as中的代码隐藏:
var l=findviewbyd(Resource.Id.login按钮);
var p=findviewbyd(Resource.Id.the_password_框);
l、 PasswordEditText=p;
//Axml是:
有关常规命令参数绑定,请参见
对于绑定到视图中的某个值,我的一般回答是不要
MvvmCross不支持ElementName或RelativeSource类型绑定源
相反,所有绑定都指向ViewModel/DataContext
对于您的应用程序示例,您可以轻松地将密码绑定到ViewModel中的属性,就像您对用户名所做的那样
评论讨论后更新 如果出于Xaml安全考虑,
Password
是一个特例,那么您可以尝试以下选项:
- 您可以使用AttachedProperties解决这些安全问题-有关详细信息,请参阅类似的链接
- 您可以在Android和iOS上绑定
属性,然后使用绑定语法将Click事件与ViewModel绑定的CommandParameter绑定—类似于Password
Click CommandParameter(LoginCmd,Password)
- 您可以使用基于ViewModel的逻辑来使用传入密码的参数或(为空时)ViewModel密码属性(
)Password=Password??Password;
- 您可以使用代码隐藏或自定义控件绑定技巧使命令参数正常工作。。。e、 g.你可以:
- 从按钮继承登录按钮
- 将
方法添加到LoginButtonSetPasswordEditText(EditText)
- 将
ICommand属性添加到LoginButton并使其启动PasswordClick
- 使用少量代码连接UI,以便在命令时提供密码
- 这看起来像
公共类登录按钮:按钮
{
公共登录按钮(上下文c,IAttributeSet a):基本(c,a){
点击+=(s,e)=>{
如果(LoginClick==null)返回;
if(PasswordEditText==null)返回;
if(LoginClick.CanExecute(PasswordEditText.Text))
LoginClick.Execute(PasswordEditText.Text);
}
}
公共ICommand登录单击{get;set;}
公共EditText密码EditText{get;set;}
}
//OnCreate as中的代码隐藏:
v
public class LoginButton : Button
{
public LoginButton(Context c, IAttributeSet a) : base(c,a) {
this.Click += (s,e) => {
if (LoginClick == null) return;
if (PasswordEditText == null) return;
if (LoginClick.CanExecute(PasswordEditText.Text))
LoginClick.Execute(PasswordEditText.Text);
}
}
public ICommand LoginClick {get;set;}
public EditText PasswordEditText {get;set;}
}
// codebehind in OnCreate as:
var l = FindViewById<LoginButton>(Resource.Id.the_login_button);
var p = FindViewById<EditText>(Resource.Id.the_password_box);
l.PasswordEditText = p;
// Axml is:
<LoginButton
local:MvxBind="LoginClick LoginCmd"
android:... etc />