Диалоговое окно оповещений в 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