如何在mvvmcross中隐藏ViewModel更新上的Android操作栏?

如何在mvvmcross中隐藏ViewModel更新上的Android操作栏?,android,xamarin.android,mvvmcross,Android,Xamarin.android,Mvvmcross,我有一个LobbyView和一个LobbyViewModel,它是使用MvvmCross for Android实现的 LobbyViewModel具有LoginCommand,用于对用户进行身份验证。如果用户经过身份验证,那么我需要隐藏LobbyView中定义的actionbar 我不知道如何访问viewmodel中的actionbar.Hide(),或者是否有其他方法可以访问它 ViewModel的代码: public class LobbyViewModel : MvxViewModel

我有一个LobbyView和一个LobbyViewModel,它是使用MvvmCross for Android实现的

LobbyViewModel具有LoginCommand,用于对用户进行身份验证。如果用户经过身份验证,那么我需要隐藏LobbyView中定义的actionbar

我不知道如何访问viewmodel中的actionbar.Hide(),或者是否有其他方法可以访问它

ViewModel的代码:

public class LobbyViewModel : MvxViewModel
{
    ISmartfoxService _smarfoxservice;
    private string _username;
    private string _password;
    private string _title = "Connect To SfsServer";
    private bool _LoginSuccces = false;
    private string _LoginVisibility = "VISIBLE";
    private int _ListVisibility = 8;
    private string _LoginError = "Connecting...";
    public LobbyViewModel(ISmartfoxService smartfoxservice)
    {
        _smarfoxservice = smartfoxservice;
    }


    public string UserName
    {
        get { return _username; }
        set { SetProperty(ref _username, value); }
    }
    public string Pass
    {
        get
        {
            return _password;
        }
        set
        {
            SetProperty(ref _password, value);
        }
    }
    public string Title
    {
        get { return _title; }
        set { SetProperty(ref _title, value); }
    }
    public bool LoginSuccess
    {
        get { return _LoginSuccces; }
        set
        {

            _LoginSuccces = value;
            RaisePropertyChanged(() => LoginSuccess);
            if (value == true)
            {
                LoginVisibility = "Gone";

            }
        }
    }
    public string LoginVisibility
    {
        get { return _LoginVisibility; }
        set { _LoginVisibility = value; RaisePropertyChanged(() => LoginVisibility); }
    }


    public int ListVisibility
    {
        get { return _ListVisibility; }
        set { _ListVisibility = value; RaisePropertyChanged(() => ListVisibility); }
    }
    public string LoginError
    {
        get { return _LoginError; }
        set { _LoginError = value; RaisePropertyChanged(() => LoginError); }
    }

    //  A Sample Login Command which notifies the Lobbyviewmodel about login status
    public ICommand LoginCommand
    {
        get
        {
            return new MvxCommand(() =>
            {
                IPhpService service = new PHPService();
                LoginResponse result = await service.TryLogin(UserName,Pass);
                if(result.isLogged==true)
                 {
                    LoginSuccess=true;
                    // Here, I would to like call the android action bar's Hide method of LobbyView.
                 }
                else
                    LoginSuccess=false;
            });
        }

    }
}
大堂视图代码:

public class LobbyView : MvxActivity
{
    public CustomAdapter customAdapter;
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.LobbyView);
        var set = this.CreateBindingSet<LobbyView, LobbyViewModel>();
        Button btnConnect = (Button)FindViewById(Resource.Id.btnlogin);
        EditText edtUserName = (EditText)FindViewById(Resource.Id.edtlogin);
        EditText edtPassword= (EditText)FindViewById(Resource.Id.edtpassword);
        TextView txtErrorMessage = (TextView)FindViewById(Resource.Id.txtloginerror);
        set.Bind(txtErrorMessage).For(tr => tr.Text).To(vm => vm.LoginError);
        set.Bind(edtUserName).For("Text").To(vm => vm.UserName);
        set.Bind(edtPassword).For("Text").To(vm => vm.Pass);
        set.Bind(btnConnect).For("Text").To(vm => vm.Title);
        set.Bind(btnConnect).For("Click").To(vm => vm.LoginCommand);
        set.Apply();

        ActionBar actionBar = this.ActionBar;
        actionBar.SetDisplayShowHomeEnabled(false);
        actionBar.SetDisplayShowTitleEnabled(false);
        LayoutInflater inflater = LayoutInflater.From(this);
        View mCustomeView=inflater.Inflate(Resource.Layout.custom_action_bar,null);
        actionBar.SetDisplayOptions(ActionBarDisplayOptions.ShowCustom, ActionBarDisplayOptions.ShowHome);
        actionBar.SetCustomView(Resource.Layout.custom_action_bar);
        actionBar.SetDisplayShowCustomEnabled(true);

    }
}
公共类游说视图:MVX活动
{
公共自定义适配器;
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.LobbyView);
var set=this.CreateBindingSet();
按钮btnConnect=(按钮)FindViewById(Resource.Id.btnlogin);
EditText edtUserName=(EditText)FindViewById(Resource.Id.edtlogin);
EditText-edtPassword=(EditText)FindViewById(Resource.Id.edtPassword);
TextView txtErrorMessage=(TextView)FindViewById(Resource.Id.txtloginerror);
set.Bind(txtErrorMessage).For(tr=>tr.Text).To(vm=>vm.LoginError);
set.Bind(edtUserName).For(“Text”).To(vm=>vm.UserName);
set.Bind(edtPassword).For(“Text”).To(vm=>vm.Pass);
set.Bind(btnConnect).For(“Text”).To(vm=>vm.Title);
set.Bind(btnConnect).For(“单击”).To(vm=>vm.LoginCommand);
set.Apply();
ActionBar ActionBar=this.ActionBar;
actionBar.SetDisplayShowHomeEnabled(false);
actionBar.SetDisplayShowTitleEnabled(false);
LayoutFlater充气机=LayoutFlater.From(本机);
View mCustomeView=inflater.Inflate(Resource.Layout.custom\u action\u bar,null);
actionBar.SetDisplayOptions(ActionBarDisplayOptions.ShowCustom、ActionBarDisplayOptions.ShowHome);
SetCustomView(Resource.Layout.custom\u action\u bar);
actionBar.SetDisplayShowCustomEnabled(true);
}
}
您可以做的是:

ViewModel.PropertyChanged += (sender, e) =>
{
    if (e.PropertyName == "LoginSuccess" && ViewModel.LoginSuccess)
    {
        //Hide Actionbar here
    }
}
要启用ViewModel类型化名称,应向ViewModel添加泛型:

public class LobbyView : MvxActivity<LobbyViewModel>
公共类游说视图:MVX活动

与@Martijn00 answer不同的是,当特定属性发生更改时,弱订阅事件

_loginSuccessSubscription = ViewModel.WeakSubscribe(() => ViewModel.LoginSucess, LoginSuccessChanged);

private void LoginSuccessChanged(object sender, PropertyChangedEventArgs args)
{
    if (ViewModel.LoginSuccess)
    {
        // do stuff on login...

        // Hide ToolBar (this in this context is the Activity or Fragment)
        this.SupportActionbar.Hide();
    }
}

这样,您就没有对事件的强引用,您可以轻松地休息。

正如旁注:ActionBar被弃用,取而代之的是工具栏。此外,您还应该使用MVXAppCompativeActivity而不是set.Bind,您可以在Android中直接在xml中绑定。(按钮)在Xamarin中不建议使用FindViewById强制转换。请改用FindViewById()。您可以使用
设置{SetProperty(ref-LoginError,value);}
而不是
设置{SetProperty(ref-LoginError,value);}
。这将为您带来变化。Martijn00,感谢您的想法,即使在使用MvxAppCompactActivity之后,我如何根据需要隐藏操作栏。任何暗示这个例子的链接都很好。