2016-05-11 1 views
10

Dans le ViewModel, j'ai la méthode Save où je vérifie la propriété isValid. Si isValid est false, alors je veux afficher un message d'erreur.Boîte de dialogue d'alerte dans ViewModel - MVVMCross

Depuis AlertDialog est plate-forme spécifique, je me demande comment gérez-vous cette situation dans le ViewModel?

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

Mise à jour

J'ai utilisé le plugin suivant et ajouté la ligne de code suivante comme suit, mais il renvoie une erreur.

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

enter image description here

Update 2

Chance.MvvmCross.Plugins.UserInteraction est un espace de noms, mais il est utilisé comme une erreur de type.

enter image description here

Mise à jour 3

J'ai ajouté Acr.UserDialogs plug-in et appelé comme suit, mais j'ai la même erreur.

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

enter image description here

+0

Avez-vous ajouté le NuGet aux projets Android et iOS ainsi ? – wishmaster

+0

Oui j'ai ajouté PCL, Android et iOS. Je pouvais juste voir 'Chance.MvvmCross.Plugins.UserInteraction.Droid' et' Chance.MvvmCross.Plugins.UserInteraction' dans la solution Android – hotspring

+0

Je viens de remarquer que le plugin Mvvmcross n'a pas été mis à jour et certaines dépendances ne peuvent pas être résolu. Je vous suggère d'utiliser un autre plugin: https://github.com/aritchie/userdialogs Vous pouvez également trouver une liste complète des plugins Xamarin ici: https: //github.com/xamarin/XamarinComponents – wishmaster

Répondre

9

L'utilisation ACR User Dialogs est l'approche la plus simple.

Dans vos App.cs (noyau/PCL), vous devrez enregistrer l'interface:

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

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

Ensuite, vous pouvez appeler votre alerte former votre ViewModel.

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

Note pour le soutien plateforme Android

Ensuite, si vous soutenez Android vous devez initialiser UserDialog avec une instance du contexte d'activité. Cela devra être fait dans chaque activité que vous utiliserez UserDialogs ou si vous avez une activité de base partagée, vous pouvez le faire là-bas.

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

Vous pouvez également

Vous pouvez suivre les Mvvmcross document sur l'utilisation des implémentations spécifiques de la plate-forme d'une interface si vous avez besoin d'une mise en œuvre plus modale personnalisée.

+0

@hotspring, voir la mise à jour de la réponse. – Plac3Hold3r

+0

Merci beaucoup, ça fonctionne comme un charme! – hotspring

+0

Si j'ai besoin de l'utiliser dans iOS, 'UserDialogs.Init (this);' doit aller où? – hotspring

3

Il y a un plugin MvvmCross existante appelée Interaction utilisateur qui permet d'afficher des alertes et la collecte des entrées de ViewModels.

De l'auteur BrianChance:

très simple, facile, de belles façons de montrer une boîte de message ou pour collecter les entrées utilisateur de votre ViewModels

Check it out here et NuGet Lien Here.

Pour installer le plug-in, assurez-vous de passer outre loadplugins dans votre classe SetUp sur iOS et Android (et Windows Phone) comme ceci:

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

} 
+0

J'ai ajouté ce plugin et exécuter l'application et a reçu une erreur. S'il vous plaît voir ma question mise à jour. – hotspring

+0

S'il vous plaît voir ma mise à jour ci-dessus – wishmaster

+0

S'il vous plaît voir ma mise à jour 2 – hotspring

1

Mon approche est que j'utilise un événement pour ce scénario. Ma classe de base pour mes modèles a une vue EventHandler OnUserNotification, où les vues peuvent peu abonner. Le UserNotificationType est juste une énumération et je laisse la vue décider comment elle réagit à la situation.

La propriété:

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

L'appel:

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

De l'avis:

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

Bien sûr, vous pouvez faire le eventtype plus complexe si nécessaire.

essayer le plugin didnt qui a obtenu suggéré par Wishmaster, donc cela pourrait être une mise en œuvre plus lisse?

+0

Que suis-je censé mettre dans la condition 'else'? Pourriez-vous s'il vous plaît fournir un peu plus d'informations? – hotspring

+0

Si vous voulez dire la condition else, vous utiliserez OnUserNotification.Invoke (this, UserNotificationType.EExampleError). Et puis vous pouvez gérer l'événement de notification dans la vue. Assurez-vous simplement que la vue attache la méthode au Eventhandler avec ViewModel.OnUserNotification + = onUserNotification; ou quelle que soit votre méthode est appelée. – Cyriac

4

Voici comment je gère les messages d'alerte dans le viewmodel. Essaye ça.

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

Il fonctionne à la fois pour iOS et Android, espérons que cela aide. –

+0

Pourriez-vous élaborer 'Current.MainPage.DisplayAlert (" xxxx ");'? – hotspring

+0

Il s'agit d'une méthode de formes xamarin intégrée dans Xamarin.Forms.Core.dll que vous devriez être en mesure de simplement atteindre à partir de votre viewmodel en tapant simplement le code que j'ai écrit ci-dessus. Cette méthode de formulaires xamarin intégrée présente une boîte de dialogue d'alerte à l'utilisateur de l'application avec un seul bouton d'annulation. Pour plus de détails et d'autres exemples de code [s'il vous plaît voir ce lien.] (Https://developer.xamarin.com/guides/xamarin-forms/user-interface/navigation/pop-ups/) –

1

Utilisez Acr.UserDialogs. Il y a un grand exemples sur github

Vous pouvez la saisir sur nuget

Il fonctionne bien avec l'injection de dépendance ou d'un singleton UserDialogs.Instance

+0

Merci beaucoup Allan. – hotspring