Диалоговое окно оповещения в ViewModel-MVVMCross

на ViewModel, Я Save метод, где я проверяю isValid собственность.

если isValid is false, затем я хочу отобразить сообщение об ошибке.

С AlertDialog платформа специфическая, интересно, как вы справляетесь с этой ситуацией в ViewModel?

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

обновление

я использовал следующее плагин и добавил следующую строку кода следующим образом, но он бросает ошибка.

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

enter image description here

обновление 2

Chance.MvvmCross.Plugins.UserInteraction - это пространство имен, но используется как тип ошибки.

enter image description here

обновление 3

я добавил Acr.UserDialogs плагин и вызывается следующим образом, но у меня такая же ошибка.

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

enter image description here

5 ответов


используя ACR пользовательские диалоги это самый простой подход.

в вашем приложении.cs (Core / PCL) вам нужно будет зарегистрировать интерфейс:

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

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

затем вы можете вызвать свою форму оповещения вашей ViewModel.

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

Примечание Для поддержки платформы Android

тогда, если вы поддерживаете Android, вам нужно будет инициализировать UserDialog с экземпляром контекста активности. Это должно быть сделано в каждом действии, которое вы будете использовать UserDialogs или если у вас есть общая база деятельности вы можете сделать это там.

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

как вариант

вы можете следовать документ Mvvmcross при использовании платформ конкретных реализаций интерфейса, если вам нужна более пользовательская модальная реализация.


вот как я обрабатываю предупреждающие сообщения в viewmodel. Попробовать это.

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

существует плагин MvvmCross под названием User Interaction, который позволяет отображать оповещения и собирать входы из ViewModels.

от автора BrianChance:

действительно простые, легкие, красивые способы показать окно сообщения или собрать пользовательский ввод из ваших ViewModels

посмотреть здесь и NuGet Link здесь.

чтобы установить плагин, убедитесь, что вы переопределяете LoadPlugins в ваш класс установки на iOS и Android (и Windows phone) выглядит так:

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

}

мой подход заключается в том, что я использую событие для этого сценария. Мой базовый класс для моих моделей представлений имеет OnUserNotification EventHandler, на который можно подписаться. UserNotificationType - это просто перечисление, и я позволяю виду решать, как он реагирует на ситуацию.

свойства:

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

звонок:

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

в виде:

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

конечно, вы можете сделать eventtype более сложным, если необходимый.

не пробовал плагин, который был предложен wishmaster, так что это может быть более плавная реализация?


Используйте Acr.UserDialogs. Есть отличные примеры на github

вы можете схватить его на NuGet для

Он хорошо работает с инъекцией зависимостей или статическими одноэлементными UserDialogs.Пример