2016-05-11 8 views
10

In der ViewModel habe ich Save Methode, wo ich überprüfen isValid Eigenschaft. Wenn isValidfalse ist, dann möchte ich eine Fehlermeldung anzeigen.Alarmdialog in ViewModel - MVVMCross

Da AlertDialog plattformspezifisch ist, frage ich mich, wie umgehen Sie diese Situation in der ViewModel?

public void Save() 
{ 
    if (isValid) 
    { 
     OnExit(this, null); 
    } 
    else 
    { 
     //issue an alert dialog here 
    } 
} 

aktualisieren

ich folgende plugin und hinzugefügt, um die folgende Codezeile verwendet haben, wie folgt, aber ein Fehler wirft.

else 
{ 
    Mvx.Resolve<IUserInteraction>().Alert("it is not valid"); 
} 

enter image description here

aktualisieren 2

Chance.MvvmCross.Plugins.UserInteraction ist ein Namespace, aber es ist als eine Art Fehler verwendet.

enter image description here

Update 3

I Acr.UserDialogs Plugin hinzugefügt haben und wie folgt genannt, aber ich habe den gleichen Fehler habe.

Mvx.Resolve<IUserDialogs>().Alert("it is not valid"); 

enter image description here

+0

Haben Sie den nuget auf die Android- und iOS-Projekte als auch hinzufügen ? – wishmaster

+0

Ja, ich habe PCL, Android und iOS hinzugefügt. Ich konnte "Chance.MvvmCross.Plugins.UserInteraction.Droid" und "Chance.MvvmCross.Plugins.UserInteraction" in der Android-Lösung sehen – hotspring

+0

Ich habe gerade festgestellt, dass das Mvvmcross-Plugin nicht auf dem neuesten Stand gehalten wurde und einige Abhängigkeiten nicht können gelöst werden. Ich würde vorschlagen, dass Sie ein anderes Plugin verwenden: https://github.com/aritchie/userdialogs Sie können auch eine vollständige Liste von Xamarin-Plugins finden Sie hier: https: //github.com/xamarin/XamarinComponents – wishmaster

Antwort

9

Mit ACR User Dialogs ist der einfachste Ansatz.

In Ihrem App.cs (Core/PCL) müssen Sie die Schnittstelle registrieren:

public class App : MvxApplication 
{ 
    public override void Initialize() 
    { 
     // Example Other registrations 
     CreatableTypes() 
      .EndingWith("Service") 
      .AsInterfaces() 
      .RegisterAsLazySingleton(); 

     Mvx.RegisterSingleton<IUserDialogs>(() => UserDialogs.Instance); 
    } 
} 

Dann können Sie Ihre Warnung bilden Ihre Ansichtsmodell nennen.

Mvx.Resolve<IUserDialogs>().Alert("it is not valid"); 

Hinweis für Android-Plattform Unterstützung

Dann, wenn Sie Android unterstützen Sie müssen UserDialog mit einer Instanz der Aktivität Kontext initialisieren. Dies muss in jeder Aktivität ausgeführt werden, die Sie verwenden UserDialogs oder wenn Sie eine gemeinsame Basisaktivität haben, können Sie es dort tun.

[Activity] 
public class MainActivity : MvxActivity 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     SetContentView(Resource.Layout.activity_main); 

     // Initialize Acr UserDialogs 
     UserDialogs.Init(this); 
    } 
} 

Alternativ

können Sie die Mvvmcross document folgen auf plattformspezifische Implementierungen einer Schnittstelle zu verwenden, wenn Sie eine benutzerdefinierte modal Implementierung benötigen.

+0

@hotspring, siehe aktualisierte Antwort. – Plac3Hold3r

+0

Vielen Dank es funktioniert wie ein Charme! – hotspring

+0

Wenn ich es in iOS verwenden muss, 'UserDialogs.Init (this);' muss wohin gehen? – hotspring

3

Es ist eine bestehende MvvmCross Plugin Benutzerinteraktion aufgerufen, die Warnungen ermöglicht und das Sammeln Eingaben von Viewmodels anzeigt.

Vom Autor BrianChance:

wirklich einfach, leicht, schöne Möglichkeiten, um ein Meldungsfeld zu zeigen oder eine Benutzereingabe von Ihrem Viewmodel

Check it out here und NuGet Link-Here zu sammeln.

Um das Plugin zu installieren, stellen Sie sicher, dass Sie LoadPlugins in Ihrer SetUp Klasse auf iOS und Android (und Windows Phone) wie so außer Kraft setzen:

public override void LoadPlugins(MvvmCross.Platform.Plugins.IMvxPluginManager pluginManager) 
{ 
    base.LoadPlugins(pluginManager); 
    pluginManager.EnsurePluginLoaded<Chance.MvvmCross.Plugins.UserInteraction>(); 

} 
+0

Ich habe dieses Plugin hinzugefügt und die App ausgeführt und einen Fehler erhalten. Bitte sehen Sie meine aktualisierte Frage. – hotspring

+0

Bitte sehen Sie mein Update oben – wishmaster

+0

Bitte sehen Sie mein Update 2 – hotspring

1

Mein Ansatz ist, dass ich ein Ereignis für dieses Szenario verwenden. Meine Basisklasse für meine Ansichtsmodelle verfügt über eine EventHandler OnUserNotification, bei der die Ansichten sich abonnieren können. Der UserNotificationType ist nur ein Enum und ich lasse die Ansicht irgendwie entscheiden, wie sie auf die Situation reagiert.

Die Eigenschaft:

public EventHandler<UserNotificationType> OnUserNotification { get; set; } 

Der Aufruf:

if (OnUserNotification != null) 
{ 
    OnUserNotification.Invoke(this, UserNotificationType.ENetworkError); 
} 

Nach Ansicht:

private void onUserNotification(object sender, UserNotificationType userNotificationType) 
{ 
    // Do Something like showing a Snackbar, AlertDialog, etc... 
} 

Natürlich können Sie die Eventtype machen komplexer, wenn nötig.

Haben Sie das Plugin, das von wishmaster vorgeschlagen wurde, nicht getestet, so dass es eine reibungslosere Implementierung geben könnte?

+0

Was soll ich in den "sonst" Zustand setzen? Könnten Sie bitte ein bisschen mehr Informationen geben? – hotspring

+0

Wenn Sie Ihre andere Bedingung meinen, würden Sie OnUserNotification.Invoke (this, UserNotificationType.EExampleError) verwenden. Und dann können Sie das Benachrichtigungsereignis in der Ansicht behandeln. Stellen Sie sicher, dass die Ansicht die Methode mit ViewModel.OnUserNotification + = onUserNotification an den Eventhandler anfügt. oder wie auch immer Ihre Methode heißt. – Cyriac

4

So behandle ich die Warnmeldungen im Viewmodel. Versuche dies.

await App.Current.MainPage.DisplayAlert("Active subscription required", "You do not have an active subscription for Part 2 exams", "OK"); 
+0

Es funktioniert für iOS und Android, hoffe es hilft. –

+0

Könnten Sie bitte 'Current.MainPage.DisplayAlert (" xxxx ");'? – hotspring

+0

Dies ist eine integrierte Xamarin-Forms-Methode in Xamarin.Forms.Core.dll, die Sie einfach von Ihrem Ansichtsmodell aus erreichen können, indem Sie einfach den Code eingeben, den ich oben geschrieben habe. Diese integrierte Xamarin-Formularmethode zeigt dem Anwendungsbenutzer einen Alarmdialog mit einer einzigen Schaltfläche zum Abbrechen an. Für weitere Details und mehr Beispielcode [bitte diesen Link sehen.] (Https://developer.xamarin.com/guides/xamarin-forms/user-interface/navigation/pop-ups/) –

1

Verwenden Sie Acr.UserDialogs. Es gibt eine große Beispiele auf github

können Sie packen es auf nuget

Es funktioniert gut mit Dependency Injection oder einem statischen Singletons UserDialogs.Instance

+0

Vielen Dank Allan. – hotspring