Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.android 如何在Android+;MVVMCross_Xamarin.android_Mvvmcross - Fatal编程技术网

Xamarin.android 如何在Android+;MVVMCross

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

我有一个非常简单的应用程序,它依赖于MVVMCross+Xamarin Android

我已经能够创建一个WP8应用程序LoginView(用户名+密码+提交按钮),它绑定到ViewModel中带有参数(将是我的密码)的Cmd。现在我试着用Android做同样的事情。如何在我的LoginView的axml文件中表示CommandParameter(视图的另一个字段)

    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上绑定
    Password
    属性,然后使用绑定语法将Click事件与ViewModel绑定的CommandParameter绑定—类似于
    Click CommandParameter(LoginCmd,Password)

  • 您可以使用基于ViewModel的逻辑来使用传入密码的参数或(为空时)ViewModel密码属性(
    Password=Password??Password;

  • 您可以使用代码隐藏或自定义控件绑定技巧使命令参数正常工作。。。e、 g.你可以:

    • 从按钮继承登录按钮
    • SetPasswordEditText(EditText)
      方法添加到LoginButton
    • PasswordClick
      ICommand属性添加到LoginButton并使其启动
    • 使用少量代码连接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上绑定
    Password
    属性,然后使用绑定语法将Click事件与ViewModel绑定的CommandParameter绑定—类似于
    Click CommandParameter(LoginCmd,Password)

  • 您可以使用基于ViewModel的逻辑来使用传入密码的参数或(为空时)ViewModel密码属性(
    Password=Password??Password;

  • 您可以使用代码隐藏或自定义控件绑定技巧使命令参数正常工作。。。e、 g.你可以:

    • 从按钮继承登录按钮
    • SetPasswordEditText(EditText)
      方法添加到LoginButton
    • PasswordClick
      ICommand属性添加到LoginButton并使其启动
    • 使用少量代码连接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 />