2016-11-29 7 views
3

Я использую MvvMCross некоторое время, и этот код работает. Я установил последние обновления, но я не могу поклясться, что это когда проблема началась. Что происходит, так это то, что у меня есть экран входа в систему с простыми текстовыми привязками к имени пользователя и паролю. Когда я компилирую с использованием общего времени выполнения, он отлично работает. Если этот флажок не установлен, он не привязывает текст к текстовым полям. Мой План заключается в следующем: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 связывания, кажется, работает хорошо. Когда он вызывает вызов 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 = [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(); 
    } 
} 

Я установил мой вопрос, возвращаясь к MvvmCross версии 4.3.0. Я оставляю это открытым, если разработчик должен знать, что происходит в последней версии.

+1

У вас есть файл 'LinkerPleaseInclude.cs' в вашем проекте? Это звучит смутно знакомо http://stackoverflow.com/questions/16924178/issues-with-mvvmcross-and-linking-on-android –

+0

Это обычная проблема. Все свойства, такие как 'TextView.Text' и т. Д., Которые вы связываете, должны упоминаться в файле' LinkerPleaseInclude.cs', который генерируется автоматически при обращении к пакетам MvvmCross. – foxanna

+0

Да. Это версия, которая входит в стартовый пакет MvvMCross. Я даже добавил запись для EditText. EditText должен быть связан с текстовым Text по умолчанию, но я пытался что-либо, о чем я мог думать. –

ответ

5

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

Спасибо, это сработало. Я установил последний стартовый пакет MvvmCross, который включает образец LinkerPleaseInclude.cs. Я просто подтвердил, что он по-прежнему ссылается на text.TextChanged. Я не уверен, кто будет его обновлять, но это, вероятно, должно быть сделано. Я опубликую это на GitHub. –

Смежные вопросы