MVVMCross для android - как сделать привязку в коде?
Я хочу использовать MVVMCross, однако для своего приложения для Android я также хочу использовать другие библиотеки (скользящее меню и панель действий), которые требуют, чтобы я унаследовал свои классы активности от их пользовательского класса. Это мешает мне наследовать MvxActivity, но я заметил, что в MVVMCross для iOS вы можете делать все свои привязки в коде (см. https://github.com/slodge/NPlus1DaysOfMvvmCross/blob/master/N-00-FirstDemo/FirstDemo.Touch/Views/FirstView.cs)
var set = this.CreateBindingSet<FirstView, FirstViewModel>();
set.Bind(textEditFirst).To(vm => vm.FirstName);
set.Bind(textEditSecond).To(vm => vm.LastName);
set.Bind(labelFull).To(vm => vm.FullName);
set.Apply();
Есть ли способ сделать это в Android?
1 ответ
Да, вы можете свободно использовать привязки в Android, если хотите.
Точно такой же код должен работать.
Вам нужно будет получить ссылки на элементы управления пользовательского интерфейса, используя FindViewById<Type>()
тогда вы можете связать их.
Например, в TipCalc вы можете добавить идентифицированные элементы управления, такие как:
<EditText
android:id="@+id/FluentEdit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:textSize="24dp"
android:gravity="right"
/>
а затем реализовать связывание, используя:
protected override void OnViewModelSet()
{
SetContentView(Resource.Layout.View_Tip);
var edit = this.FindViewById<EditText>(Resource.Id.FluentEdit);
var set = this.CreateBindingSet<TipView, TipViewModel>();
set.Bind(edit).To(vm => vm.SubTotal);
set.Apply();
// for non-default properties use 'For':
// set.Bind(edit).For(ed => ed.Text).To(vm => vm.SubTotal);
// you can also use:
// .WithConversion("converter", "optional parameter")
// .OneTime(), .OneWay() or .TwoWay()
}
Кроме того, вы можете преобразовать любую функцию FooActivity в MvxFooActivity для привязки данных следующим образом:
- наследование от FooActivity для предоставления событий из событий времени жизни в EventSourceFooActivity
- наследование от EventSourceFooActivity для предоставления контекста данных в MvxFooActivity
- затем вы можете написать свой код внутри действий, унаследованных от MvxFooActivity
Чтобы увидеть необходимый код, смотрите:
- https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Droid.Fragging/MvxEventSourceFragmentActivity.cs
- https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Droid.Fragging/MvxFragmentActivity.cs
Вы увидите один и тот же код во всех действиях, адаптированных для mvx - MvxActivity, MvxTabActivity,... Здесь есть небольшая вырезка и вставка, но в общих методах расширения помещается как можно больше кода.
В предыдущих версиях люди использовали эту технику, чтобы связать моногамные и рекламные гугл-активности - например, см. Вставка моногамного видения в MvvmCross monodroid Activity