在MVVMCross Android应用上轮换问题。使用对话框主题时命令绑定丢失

时间:2014-07-01 09:48:38

标签: android xamarin mvvmcross

我已经使用MVVMCross几个月了,到目前为止给我留下了非常深刻的印象。但是,我遇到了一个我无法解决的问题。

我已经将其分解为最简单的解决方案,以便可以重现问题。问题的中心是在“对话框”主题中设置活动按钮。旋转设备时,按钮命令绑定将丢失,按钮不再触发视图模型中的命令。奇怪的是,所有其他绑定仍然有效。

为了模拟这个,我创建了一个

的解决方案

1)一个简单的MvxActivity,只有一个按钮。此按钮打开第二个活动,该活动被设置为对话框。

2)在第二个MvxActivity上,我有几个按钮和一个EditText和TextView控件。这些按钮绑定到视图模型上的命令,EditText和TextView也绑定到属性。

我尝试将以下属性添加到第二个活动(如其他地方所建议的那样),但它不起作用。

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

以下是导致此问题的第二个视图。删除主题属性将使其工作 - 但我想要一个对话框主题!:

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);
        }
    }
}

以下是该视图的视图模型:

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。

0 个答案:

没有答案