2016-11-29 4 views
3

Ich benutze MvvMCross schon seit einer Weile und dieser Code hat funktioniert. Ich habe die neuesten Updates installiert, aber ich kann nicht schwören, dass dies der Zeitpunkt war, an dem das Problem begann. Was passiert ist, dass ich einen Login-Bildschirm mit einfachen Textbindungen zum Benutzernamen und Passwort habe. Wenn ich mit Shared Runtime verwenden kompiliere, funktioniert es gut. Wenn dies nicht aktiviert ist, wird der Text nicht an die Textfelder gebunden. Mein Plan ist wie folgt:mvvmcross binding im Freigabemodus

<?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> 

Meine Ansicht Modell ist wie folgt:

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


} 

Die auf die CheckLogin Knopf Bindung scheint die Bindung zu funktionieren. Wenn der Aufruf von CheckTabletUser erfolgt, sind die Eigenschaften UserName und Password leer.

Ich bearbeite das, damit Leute meine LinkerPleaseInclude.cs Datei sehen können. Es ist die Vanille ein, die mit dem MvvmCross Starter Pack kommt:

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 = [email protected]; 
    } 

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

ich mein Problem behoben von 4.3.0 auf MvvmCross Version zurückkehrt. Ich lasse das offen für den Fall, dass ein Entwickler wissen muss, was in der neuesten Version passiert.

+1

Haben Sie die 'LinkerPleaseInclude.cs' Datei in Ihrem Projekt? Das klingt vage vertraut zu http://stackoverflow.com/questions/16924178/issues-with-mvvmcross-and-linking-on-android –

+0

Es ist ein häufiges Problem. Alle Eigenschaften wie 'TextView.Text' usw., an die Sie binden, sollten in' LinkerPleaseInclude.cs' erwähnt werden, die automatisch generiert wird, wenn Sie auf MvvmCross-Pakete verweisen. – foxanna

+0

Ja. Es ist die Version, die im MvvMCross-Starterpaket enthalten ist. Ich habe sogar einen Eintrag für EditText hinzugefügt. EditText sollte mit dem Standard-TextView verknüpft sein, aber ich habe alles versucht, was mir einfällt. –

Antwort

5

MvvmCross verwendet das Ereignis AfterTextChanged anstelle von TextChanged, um auf Änderungen in EditText/TextView zu warten. In Ihrem LinkerPleaseInclude.cs sollten Sie nur ändern, um das AfterTextChanged Ereignis zu verwenden. Dann sollten Sie keine Probleme mit v4.4 haben.

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

Danke, das hat funktioniert. Ich hatte das neueste MvvmCross Starter Pack installiert, das das Beispiel LinkerPleaseInclude.cs enthielt. Ich habe gerade überprüft, dass es immer noch auf text.TextChanged verweist. Ich bin mir nicht sicher, wer derjenige sein würde, der es aktualisiert, aber es sollte wahrscheinlich getan werden. Ich werde dies auf GitHub veröffentlichen. –