Ответ 1
Автоматическое связывание свойств
MvvmCross связывается с свойствами С# в собственных представлениях - поэтому любое общедоступное свойство С# get/set, открытое Xamarin.Android, может быть привязано к одностороннему.
Кроме того, если свойство Foo
сопровождается событием подписи public event EventHandler FooChanged
, то MvvmCross может привязываться к нему в двух направлениях.
Автоматическая привязка событий
MvvmCross также связывается с любым public
С# event
, который отображается с помощью собственных представлений - если у них есть подписи EventHandler
и не EventHandler<SomeSpecialArgs>
Они могут автоматически привязываться к ICommand
вызывающим (действие автоматически привязывается к обработчику Execute
, но ничего не привязано к CanExecute
).
Пользовательская привязка
Помимо этих прямолинейных свойств, MvvmCross также имеет возможности для "пользовательских привязок".
Список "настраиваемых привязок", поставляемый по умолчанию в MvvmCross, находится в FillTargetBindings
в AndroidBindingBuilder - https://github.com/MvvmCross/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Binding.Droid/MvxAndroidBindingBuilder.cs#L79
registry.RegisterCustomBindingFactory<TextView>("Text",
textView => new MvxTextViewTextTargetBinding(textView));
registry.RegisterPropertyInfoBindingFactory((typeof(MvxAutoCompleteTextViewPartialTextTargetBinding)),
typeof(AutoCompleteTextView), "PartialText");
registry.RegisterPropertyInfoBindingFactory(
typeof(MvxAutoCompleteTextViewSelectedObjectTargetBinding),
typeof(AutoCompleteTextView),
"SelectedObject");
registry.RegisterPropertyInfoBindingFactory(typeof(MvxCompoundButtonCheckedTargetBinding),
typeof(CompoundButton), "Checked");
registry.RegisterPropertyInfoBindingFactory(typeof(MvxSeekBarProgressTargetBinging), typeof(SeekBar),
"Progress");
registry.RegisterCustomBindingFactory<View>("Visible",
view => new MvxViewVisibleBinding(view));
registry.RegisterCustomBindingFactory<View>("Hidden",
view => new MvxViewHiddenBinding(view));
registry.RegisterCustomBindingFactory<ImageView>("Bitmap",
imageView => new MvxImageViewBitmapTargetBinding(imageView));
registry.RegisterCustomBindingFactory<ImageView>("DrawableId",
imageView => new MvxImageViewDrawableTargetBinding(imageView));
registry.RegisterCustomBindingFactory<ImageView>("DrawableName",
imageView => new MvxImageViewDrawableNameTargetBinding(imageView));
registry.RegisterCustomBindingFactory<ImageView>("AssetImagePath",
imageView => new MvxImageViewImageTargetBinding(imageView));
registry.RegisterCustomBindingFactory<MvxSpinner>("SelectedItem",
spinner =>
new MvxSpinnerSelectedItemBinding(
spinner));
registry.RegisterCustomBindingFactory<AdapterView>("SelectedItemPosition",
adapterView =>
new MvxAdapterViewSelectedItemPositionTargetBinding
(adapterView));
registry.RegisterCustomBindingFactory<MvxListView>("SelectedItem",
adapterView =>
new MvxListViewSelectedItemTargetBinding
(adapterView));
registry.RegisterCustomBindingFactory<RatingBar>("Rating",
ratingBar => new MvxRatingBarRatingTargetBinding(ratingBar));
registry.RegisterCustomBindingFactory<View>("LongClick",
view =>
new MvxViewLongClickBinding(view));
registry.RegisterCustomBindingFactory<MvxRadioGroup>("SelectedItem",
radioGroup => new MvxRadioGroupSelectedItemBinding(radioGroup));
Несколько плагинов (особенно Color
) также добавляют свои собственные привязки.
Информацию о добавлении собственных пользовательских привязок см. в http://slodge.blogspot.co.uk/2013/06/n28-custom-bindings-n1-days-of-mvvmcross.html
Темы N + 1 на пользовательских элементах MvvmCross, на анимации и на картах также заслуживают внимания - они предоставляют альтернативные механизмы для пользовательских привязок.
Подробнее о привязке MvvmCross см. https://github.com/MvvmCross/MvvmCross/wiki/Databinding