我已经使用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修复了我的问题。如果开发人员需要知道最新版本中发生了什么,我将保持开放状态。
答案 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;
}