Диалоговое окно оповещения в 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");
}
обновление 2
Chance.MvvmCross.Plugins.UserInteraction
- это пространство имен, но используется как тип ошибки.
обновление 3
я добавил Acr.UserDialogs плагин и вызывается следующим образом, но у меня такая же ошибка.
Mvx.Resolve<IUserDialogs>().Alert("it is not valid");
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, так что это может быть более плавная реализация?