【发布时间】:2017-04-13 22:27:56
【问题描述】:
我已经使用 MvvMCross 一段时间了,这段代码一直在工作。我确实安装了最新的更新,但我不能发誓这是问题开始的时候。发生的事情是我有一个登录屏幕,其中包含与用户名和密码的简单文本绑定。当我使用使用共享运行时进行编译时,它工作正常。如果未选中此项,则不会将文本绑定到文本字段。我的布局如下:
<?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 解决了我的问题。如果开发人员需要知道最新版本中发生了什么,我将保持打开状态。
【问题讨论】:
-
您的项目中有
LinkerPleaseInclude.cs文件吗? stackoverflow.com/questions/16924178/… 这听起来有点熟悉 -
这是一个常见问题。您绑定到的所有属性(如
TextView.Text等)都应在LinkerPleaseInclude.cs文件中提及,该文件在您引用 MvvmCross 包时自动生成。 -
是的。它是 MvvMCross 入门包中的版本。我什至为 EditText 添加了一个条目。 EditText 应该与默认的 TextView 链接,但我正在尝试任何我能想到的。
-
@JimWilcox,只是为了确认一下,在您的
LinkerPleaseInclude.cs中,您包含TextView并且正在订阅AfterTextChanged?由于EditText继承TextView,因此包含 TextView 将涵盖这两个控件。类似<<the_textView_control>>.AfterTextChanged += (sender, args) => text.Text = "" + text.Text; -
@Plac3Hold3r 我已经恢复到 MvvmCross 版本 4.3.0,它解决了这个问题。如果有帮助,我将编辑我的 OP 以显示我的 LinkerPleaseInclude.cs 文件。
标签: xamarin xamarin.android mvvmcross