2017-07-24 2 views
2

Neuling hier. Ich möchte eine Warnung von ViewModel anzeigen.Wie Alarm von ViewModel angezeigt wird

Problem: Der Name 'DisplayAlert' existiert nicht im aktuellen Kontext

Wie das zu tun? Unten ist mein Code.

-- XAML 
<Button x:Name="BtnLogin" Command="{Binding LoginCommand}" BackgroundColor="Green" TextColor="White" WidthRequest="150" HeightRequest="60" Text="Login" /> 


--- ViewModel : 

class LoginViewModel : ViewModelBase 
    { 


     private string _username; 

     public string Username 
     { 
      get { return _username; } 
      set 
      { 
       _username = value; 
       OnPropertyChanged(); 
      }  
     } 

     private string _password; 

     public string Password 
     { 
      get { return _password; } 
      set 
      { 
       _password = value; 
       OnPropertyChanged(); 
      } 
     } 

     public LoginViewModel() 
     {   

     } 

     public Command LoginCommand 
     { 
      get 
      { 
       return new Command(ValidateUser); 
      } 

     }  

     async void ValidateUser() 
     { 
      if (_username.Length > 1 && _password.Length > 1) 
      { 
       //await DisplayAlert("Login", "Login Success", "Ok"); 
      //--Update: 

       UserDialogs.Instance.Alert("Login Success", "Login", "OK"); 
      } 
      else 
      { 
       // display invalid credential 
      } 
     } 

aktualisieren Es gibt a) Acr.UserDialogs V6.5.1 b) Acr.XamForms.UserDialog v5.0.0

Ich verwende die ältere Version, die (b), da ich m mit PCL.

Ich habe es importiert und ändern Sie den Code, um es wie oben zu verwenden. Aber es gibt Fehler msg: mit Acr.UserDialogs;

Err Msg:

java.lang.NullPointerException: Ausnahme vom Typ 'java.lang.NullPointerException' geworfen wurde. bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei Java.Interop.JniEnvironment + InstanceMethods.CallNonvirtualVoidMethod (Java.Interop.JniObjectReference Beispiel Java.Interop.JniObjectReference Typ, Java. Interop.JniMethodInfo-Methode, Java.Interop.JniArgumentValue * args) [0x00089] in: 0 bei Java.Interop.JniPeerMembers + JniInstanceMethods.FinishCreateInstance (System.String-KonstruktorSignatur, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue * -Parameter) [0x0004f] in: 0 bei Android.App.AlertDialog + Builder..ctor (Kontext von Android.Content.Context) [0x0007a] in: 0 bei Acr.UserDialogs.Builders.AlertBuilder.Build (Android.App.Activity Aktivität, Acr.UserDialogs.AlertConfig config) [0x0000d] in: 0 bei Acr.UserDialogs.UserDialogsImpl.Alert (Acr.UserDialogs.AlertConfig config) [0x00038] in: 0 bei Acr.UserDialogs.AbstractUserDialogs.Alert (System.String Nachricht, System.String Titel, System.String okText) [0x00024] in : 0 bei BookingNow.ViewModel.LoginViewModel.ValidateUser() [0x00026] in C: \ Benutzer \ Edward \ Dokumente \ Visual Studio 2017 \ Projekte \ BookingNow \ BookingNow \ BookingNow \ ViewModel \ LoginViewModel.cs: 88 --- Ende der verwalteten Java.Lang.NullPointerException Stack-Trace --- java.lang.NullPointerException bei android.app.AlertDialog.resolveDialogTheme (AlertDialog.java:143) bei android.app.AlertDialog $ Builder. (AlertDialog.java:360) bei md5270abb39e60627f0f200893b490a1ade.ButtonRenderer_ButtonClickListener.n_onClick (native Methode) bei md5270abb3 9e60627f0f200893b490a1ade.ButtonRenderer_ButtonClickListener.onClick (ButtonRenderer_ButtonClickListener.java:30) bei android.view.View.performClick (View.java:4476) bei android.view.View $ PerformClick.run (View.java:18787) bei Android. os.Handler.handleCallback (Handler.java:730) bei android.os.Handler.dispatchMessage (Handler.java:92) bei android.os.Looper.loop (Looper.java:176) bei android.app. ActivityThread.main (ActivityThread.java:5493) bei java.lang.reflect.Method.invokeNative (systemeigene Methode) bei java.lang.reflect.Method.invoke (Method.java:525) bei com.android.internal .os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1209) bei com.android.internal.os.ZygoteInit.main (Zyg oteInit.java:1025) bei dalvik.system.NativeStart.main (native Methode)

Dank

+0

Was haben Sie bisher versucht? –

+0

Der Name 'DisplayAlert' ist im aktuellen Kontext nicht vorhanden – MilkBottle

+0

Können Sie Ihre Stack-Ablaufverfolgung freigeben, wenn das passiert? Außerdem ist 'DisplayAlert' am wahrscheinlichsten mit dem UI-Lebenszyklus verknüpft, so dass es nicht direkt außerhalb einer Seite aufgerufen werden kann (in Ihrem Fall das ViewModel). Eine Lösung hierfür wurde [hier] bereitgestellt (https://forums.xamarin.com/discussion/22499/looking-to-pop-up-an-alert-like-displayalert-but- from-the-view-model- xamarin-forms-labs) mit einer Pub/Sub-Implementierung. –

Antwort

2

Wenn Sie es rein halten wollen, dann sollten Sie darauf verzichten, Warnungen in der traditionellen Art und Weise mit und in gewisser Weise Eingang zu sammeln, die Sie von Makeln eine Eigenschaft auslösen können.

Es gibt jedoch einen anderen, einfacheren Weg. Sie könnten ACR.UserDialogs verwenden. Wenn Sie .NET Standard noch nicht verwenden, müssen Sie eine ältere Version des NuGet-Pakets installieren. Denken Sie daran, es sowohl in Ihrem freigegebenen Projekt als auch in den Plattformprojekten zu installieren. Je nach Plattform benötigen Sie möglicherweise auch einen Initialisierungscode. Überprüfen Sie die Readme-Datei.

Sie können die Instanz jetzt entweder direkt anrufen mit: UserDialogs.Instance und dann eine Methode, um eine Warnung oder was auch immer Sie benötigen anzuzeigen. Um es ein wenig mehr MVVM wie Sie zu behalten könnte diese Instanz auch mit seinem Schnittstellen-Gegenstück registrieren und es in Ihre Ansichtsmodelle injizieren lassen.

+0

Dies funktioniert: warten Application.Current.MainPage.DisplayAlert ("Login", "Login Success", "Ok"); Aber ich habe nicht die MainPage.xaml in meinem Projekt.Ich habe es gelöscht. Warum funktioniert das? – MilkBottle

+0

'Application.Current.MainPage' verweist nicht auf eine Datei oder Klasse namens' MainPage', sondern ist eine Eigenschaft des 'App'-Objekts und enthält die Seite, die als Hauptseite Ihrer Anwendung festgelegt ist. So kann es jede Seite sein. –

+0

Ich habe es zu allen Projekten durch Rechtsklick-Lösung hinzugefügt und hinzugefügt. Es scheint, ich habe Fehler bei der Verwendung. Habe ich etwas vergessen? Danke – MilkBottle

Verwandte Themen