Проблема с поворотом в приложении MvvmCross для Android. Привязки команд теряются при использовании темы диалога

#android #xamarin #mvvmcross

#Android #xamarin #mvvmcross

Вопрос:

Я использую MvvmCross уже пару месяцев и до сих пор был очень впечатлен. Однако я столкнулся с проблемой, которую пока не смог решить.

Я разбил это на самое простое решение, которое я могу, чтобы проблему можно было воспроизвести. Проблема связана с наличием кнопки для действия, которая оформлена в «диалоговой» теме. При повороте устройства привязки команд кнопок теряются, и кнопки больше не запускают команды в модели представления. Странно то, что все остальные привязки все еще работают.

Для имитации этого я создал решение, которое имеет

1) Простая MvxActivity с одной кнопкой. Эта кнопка открывает второе действие, которое оформлено как диалоговое окно.

2) На этом втором MvxActivity у меня есть пара кнопок и элемент управления EditText и TextView. Кнопки привязаны к командам в модели представления, а EditText и TextView также привязаны к свойствам.

Я попытался добавить следующий атрибут ко второму действию (как предложено в другом месте), но это не работает.

 ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize
  

Вот второе представление, которое вызывает проблему. Удаление атрибута theme заставит его работать, но я хочу тему диалога!:

 using Android.App;
using Android.OS;
using Cirrious.MvvmCross.Droid.Views;

namespace RotateIssue.Views
{
    [Activity(Label = "MyActivity", Theme = "@android:style/Theme.Holo.Dialog")]
    public class SecondView : MvxActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.SecondView);
        }
    }
}
  

Вот viewmodel для этого представления:

 using Cirrious.MvvmCross.ViewModels;
using System.Windows.Input;

namespace RotateIssue.Core.ViewModels
{
    public class SecondViewModel : MvxViewModel
    {
        private string _hello = "";
            public string Hello
    { 
        get { return _hello; }
        set { _hello = value; RaisePropertyChanged(() => Hello); }
    }

        public bool DataValid
        {
            get
            {
                return (_hello.Length > 0);
            }
        }

        private MvxCommand _saveCommand;
        public ICommand SaveCommand
        {
            get
            {
                _saveCommand = _saveCommand ?? new MvxCommand(SaveAsset);
                return _saveCommand;
            }
        }

        private MvxCommand _cancelCommand;
        public ICommand CancelCommand
        {
            get
            {
                _cancelCommand = _cancelCommand ?? new MvxCommand(Cancel);
                return _cancelCommand;
            }
        }

        public void Cancel()
        {
             Close(this);
        }

        public void SaveAsset()
        {
            if (DataValid)
            {
                //TODO: Do something useful
                Close(this);
            }
        }
    }
}
  

При необходимости я могу предоставить AXML. Приложение настроено на уровне API 16.

Комментарии:

1. Может быть, попробуйте добавить ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize к родительскому действию, а не к диалоговому окну?

2. Хорошо — кажется, это сработало! Мне нужно будет проверить мой основной проект, чтобы узнать, вызывает ли это изменение какие-либо другие проблемы, но я не вижу в этом проблемы. Большое спасибо за быстрый ответ.