Я использую MvvmCross для создания моего Android-приложение, и я столкнулся со следующей проблемой:Показать AlertDialog из ViewModel с помощью MvvmCross
Когда я пытаюсь показать AlertDialog, который был создан в ViewModel, то
"Необработанное исключение: появляется Android.Views.WindowManagerBadTokenException".
public class MyViewModel : MvxViewModel
{
public ICommand ShowAlertCommand { get; private set; }
public AuthorizationViewModel()
{
ShowAlertCommand = new MvxCommand(() =>
{
var adb = new AlertDialog.Builder(Application.Context);
adb.SetTitle("Title here");
adb.SetMessage("Message here");
adb.SetIcon(Resource.Drawable.Icon);
adb.SetPositiveButton("OK", (sender, args) => { /* some logic */});
adb.SetNegativeButton("Cancel", (sender, args) => { /* close alertDialog */});
adb.Create().Show();
});
}
}
Когда я researching я обнаружил, что это происходит из-за передачи ссылки на контекст, но не на активность в AlertDialog.Builder.
В this topic я нашел следующее решение: Получить ссылки на текущую активность за счет использования GetService(), но я не нашел mvvmcross плагинов для работы с IMvxServiceConsumer, IMvxAndroidCurrentTopActivity интерфейсы.
Мой вопрос Можно ли показать AlertDialog с ViewModel? И как я могу получить ссылку на Activity, но не на Application.Context? И какой правильный способ закрыть AlertDialog, чтобы пользователь оставался в текущем представлении?
Хорошо, я пробую этот материал :) –
Я согласен с тем, что работа с пользовательским интерфейсом от VM не является «фэн-шуй»;), но платформы WinPhone и iPhone уже запущены, и мне просто нужно было в Android версию моего приложения. В будущем, в моих новых проектах, я обязательно буду развиваться согласно канонам MVVM :) –
Стюарт, короткий вопрос о 'IMvxAndroidCurrentTopActivity': будет ли он всегда быть тем же самым экземпляром, даже если текущая верхняя активность изменяется? Предпосылки: я не являюсь поклонником местоположения службы, вместо этого мои классы принимают явные зависимости. Будет ли это работать, если у моего одноэлементного класса есть зависимость конструктора от 'IMvxAndroidCurrentTopActivity' и он все еще может работать с текущей деятельностью? –