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

В ViewModel у меня есть метод Save, где я проверяю свойство isValid.

Если isValid - false, тогда я хочу отобразить сообщение об ошибке.

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

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

Обновление

Я использовал следующий plugin и добавил следующую строку кода следующим образом, но он выдает ошибку.

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

введите описание изображения здесь

Обновление 2

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

введите описание изображения здесь

Обновление 3

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

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

введите описание изображения здесь

Ответ 1

Использование ACR User Dialogs - самый простой способ.

В вашем App.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 document при использовании специфичных для платформы реализаций интерфейса, если вам нужна более обычная модальная реализация.

Ответ 2

Вот как я обрабатываю сообщения Alert в модели viewmodel. Попробуйте это.

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

Ответ 3

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

От автора BrianChance:

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

Проверьте здесь и NuGet Link Здесь.

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

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

}

Ответ 4

Мой подход заключается в том, что я использую событие для этого сценария. Мой базовый класс для моих моделей просмотра имеет EventHandler OnUserNotification, где представления могут подходить под произвольную подписку. 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...
}

Конечно, вы можете сделать тип события более сложным, если необходимо.

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

Ответ 5

Использовать Acronis. Есть отличные примеры на github

Вы можете захватить его на nuget

Он хорошо работает с инъекцией зависимостей или статическим singleton UserDialogs.Instance