2016-09-08 15 views
1

私はAndroid用MvvmCrossを使用して実装されたLobbyViewとLobbyViewModelを持っていますmvvmcrossのViewModelの更新でAndroidのActionBarを非表示にするには?

LobbyViewModelには、ユーザーの認証に使用されるLoginCommandがあります。ユーザーが認証されている場合は、LobbyViewで定義されているアクションバーを非表示にする必要があります

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

    } 
} 
+0

サイドバーと同様に、ActionBarは推奨されなくなりました。また、MvxAppCompatActivity – Martijn00

+0

を使用する必要があります。set.Bindではなく、Androidでxmlを直接バインドすることができます。 – Martijn00

+0

(ボタン)FindViewByIdキャストはXamarinではお勧めできません。代わりにFindViewById

答えて

1

何ができるかは、次のとおりです。のViewModelを有効にするには

ViewModel.PropertyChanged += (sender, e) => 
{ 
    if (e.PropertyName == "LoginSuccess" && ViewModel.LoginSuccess) 
    { 
     //Hide Actionbar here 
    } 
} 

あなたがジェネリックを追加する必要があります名前を入力しましたビューモデルへ:

public class LobbyView : MvxActivity<LobbyViewModel> 
1

また@ Martijn00答えには、特定のプロパティが変更されたときのイベントを弱く購読することです。

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

この方法は、あなたは、イベントへの強い参照を持っていないと、あなたは少し簡単に休むことができます。

関連する問題