发布模式下的mvvmcross绑定

时间:2016-11-29 19:22:53

标签: xamarin xamarin.android mvvmcross

我已经使用MvvMCross一段时间了,这段代码一直在运行。我确实安装了最新的更新,但我不能发誓这是问题开始的时候。发生的事情是我有一个登录屏幕,其中包含对用户名和密码的简单文本绑定。当我使用Use Shared Runtime编译时,它工作正常。如果未选中此选项,则不会将文本绑定到文本字段。我的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<LinearLayout
    android:layout_width="250dp"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="50dp"
    android:background="@drawable/borderdoublewidth">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            style="@style/InputTextView"
            android:text="User Name" />
        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/txtUserName"
            style="@style/InputEditText"
            local:MvxBind="Text UserName" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            style="@style/InputTextView"
            android:text="Password" />
        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/txtPassword"
            android:inputType="textPassword"
            android:password="true"
            style="@style/InputEditText"
            local:MvxBind="Text Password" />
    </LinearLayout>
    <Button
        android:text="Login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        local:MvxBind="Click CheckLogin" />
</LinearLayout>
</LinearLayout>

我的视图模型如下:

class LoginViewModel : MvxViewModel
{

    public void Init()
    {
    }

    public override void Start()
    {
        base.Start();

        Task.Run(async () =>
        {
            var l = await ListDataSource.GetLocations();
            Locations = l.Location.ToArray<string>();
        });
    }

    public string Location
    {
        get
        {
            return Settings.Location;
        }
        set
        {
            Settings.Location = value;
            RaisePropertyChanged(() => Location);
        }
    }

    private string[] _Locations;
    public string[] Locations
    {
        get
        {
            return _Locations;
        }
        set
        {
            _Locations = value;
            RaisePropertyChanged(() => Locations);
        }
    }

    private string _UserName;
    public string UserName
    {
        get
        {
            return _UserName;
        }
        set
        {
            _UserName = value;
            RaisePropertyChanged(() => UserName);
            EventLog.Debug("UserName Changed <" + _UserName + ".");
        }
    }

    private string _Password;
    public string Password
    {
        get
        {
            return _Password;
        }
        set
        {
            _Password = value;
            RaisePropertyChanged(() => Password);
        }
    }

    public IMvxCommand CheckLogin
    {
        get
        {
            return new MvxCommand(() =>
                ValidateDriver()
                );
        }
    }

    private bool LoggingIn = false;
    private async void ValidateDriver()
    {
        if (Settings.Location == null)
        {
            MiscFunctions.messageBox("Please set the Location!");
            return;
        }
        if (LoggingIn)
            return;

        LoggingIn = true;

        //btnLogin.Focus(Windows.UI.Xaml.FocusState.Programmatic);
        string VersionName = "";
        MPS_Mobile_Warehouse.Droid.Views.LoginView act = (Mvx.Resolve<IMvxAndroidCurrentTopActivity>().Activity as MPS_Mobile_Warehouse.Droid.Views.LoginView) ?? null;
        if (act != null)
        {
            VersionName = act.GetAppVersionName();
        }

        //DriverName gets set in this call.
        if (await ShipmentDataSource.CheckTabletUser(UserName, Password, VersionName))
        {
            ShowViewModel<MainViewModel>();
        }
        LoggingIn = false;
    }


}

对CheckLogin Button绑定的绑定似乎工作正常。当它调用CheckTabletUser时,UserName和Password属性为空。

我正在编辑这个,以便人们可以看到我的LinkerPleaseInclude.cs文件。这是MvvmCross Starter Pack附带的香草:

public class LinkerPleaseInclude
{
    public void Include(Button button)
    {
        button.Click += (s, e) => button.Text = button.Text + "";
    }

    public void Include(CheckBox checkBox)
    {
        checkBox.CheckedChange += (sender, args) => checkBox.Checked = !checkBox.Checked;
    }

    public void Include(Switch @switch)
    {
        @switch.CheckedChange += (sender, args) => @switch.Checked = !@switch.Checked;
    }

    public void Include(View view)
    {
        view.Click += (s, e) => view.ContentDescription = view.ContentDescription + "";
    }

    public void Include(TextView text)
    {
        text.TextChanged += (sender, args) => text.Text = "" + text.Text;
        text.Hint = "" + text.Hint;
    }

    public void Include(CheckedTextView text)
    {
        text.TextChanged += (sender, args) => text.Text = "" + text.Text;
        text.Hint = "" + text.Hint;
    }

    public void Include(CompoundButton cb)
    {
        cb.CheckedChange += (sender, args) => cb.Checked = !cb.Checked;
    }

    public void Include(SeekBar sb)
    {
        sb.ProgressChanged += (sender, args) => sb.Progress = sb.Progress + 1;
    }

    public void Include(Activity act)
    {
        act.Title = act.Title + "";
    }

    public void Include(INotifyCollectionChanged changed)
    {
        changed.CollectionChanged += (s, e) => { var test = $"{e.Action}{e.NewItems}{e.NewStartingIndex}{e.OldItems}{e.OldStartingIndex}"; };
    }

    public void Include(ICommand command)
    {
        command.CanExecuteChanged += (s, e) => { if (command.CanExecute(null)) command.Execute(null); };
    }

    public void Include(MvvmCross.Platform.IoC.MvxPropertyInjector injector)
    {
        injector = new MvvmCross.Platform.IoC.MvxPropertyInjector();
    }

    public void Include(System.ComponentModel.INotifyPropertyChanged changed)
    {
        changed.PropertyChanged += (sender, e) => {
            var test = e.PropertyName;
        };
    }

    public void Include(MvxTaskBasedBindingContext context)
    {
        context.Dispose();
        var context2 = new MvxTaskBasedBindingContext();
        context2.Dispose();
    }
}

我通过恢复到MvvmCross版本4.3.0修复了我的问题。如果开发人员需要知道最新版本中发生了什么,我将保持开放状态。

1 个答案:

答案 0 :(得分:7)

MvvmCross使用AfterTextChanged事件代替TextChanged来侦听EditText / TextView中的更改。在LinkerPleaseInclude.cs中,您只需更改即可使用AfterTextChanged事件。那么你应该对v4.4没有任何问题。

public void Include(TextView text)
{
   text.AfterTextChanged += (sender, args) => text.Text = "" + text.Text;
   text.Hint = "" + text.Hint;
}