Беглые привязки и названия UIButton
Поскольку мои пользовательские интерфейсы обычно должны иметь локализованные строки, мои модели представлений предоставляют все строки, которые потребляют представления. Это включает в себя такие вещи, как названия на кнопках.
На стороне iOS заголовки кнопок устанавливаются с помощью метода SetTitle.
Для того, чтобы получить представление модели string => button title mapping для работы, MvvmCross делает некоторый магический перевод привязки, чтобы заставить это работать хорошо.
Скажем, у меня есть UIButton по имени Foo в моем представлении, и я хочу сопоставить его название к свойству ButtonLabel в моей модели представления. В know следующие работы для того, чтобы установить такую привязку:
this.AddBindings(new Dictionary<object, string>() {
{Foo, "Title ButtonTitle"}
});
Можно ли настроить такую же привязку с помощью системы Fluent Binding в MvvmCross? Я читал через источник MvvmCross, и я не совсем понимаю код привязки.
Это не работает (потому что в действительности кнопка не имеет свойства Title - У нее есть метод SetTitle):
var set = this.CreateBindingSet<FooView, FooViewModel>();
set.Bind(Foo).For(b => b.Title).To(vm => vm.ButtonTitle);
set.Apply();
Есть ли другой способ достичь желаемого результата? использование беглых Привязок?2 ответа:
Поскольку кнопка не имеет свойства заголовка, то
set.Bind(Foo).For(b => b.Title).To(vm => vm.ButtonTitle);
Не будет компилироваться.
Однако конфигурация MvvmCross по умолчанию для Xamarin.ios имеет пользовательскую привязку , определенную для UIButton и "Title" - см.:
- https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Binding.Touch/Target/MvxUIButtonTitleTargetBinding.cs
- который зарегистрирован: https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Binding.Touch/MvxTouchBindingBuilder.cs#L56
Из-за этого вы должны быть в состоянии вызвать:
set.Bind(Foo).For("Title").To(vm => vm.ButtonTitle);
И это должно установить такую же привязку, как:
this.AddBindings(new Dictionary<object, string>() { {Foo, "Title ButtonTitle"} });
Очень краткое введение в пользовательские привязки см.: https://speakerdeck.com/cirrious/custom-bindings-in-mvvmcross
В новой версии MvvmCross 5.x существуют строго типизированные свойства привязки на основе кода.
Они делаются так:
set.Bind(Button).For(v => v.BindTitle()).To(vm => vm. ButtonTitle);
Убедитесь, что вы добавили это с помощью:
using MvvmCross.Binding.iOS;
Полный список свойств расширения можно найти в документации здесь и это PR, в котором произошли изменения.