Свободные привязки и названия UIButton
Поскольку мои пользовательские интерфейсы обычно должны иметь локализованные строки, мои модели просмотра предоставляют все строки, которые потребляют представления. Это включает в себя такие вещи, как названия на кнопках.
на стороне iOS, названия кнопок устанавливаются с помощью метода SetTitle.
Чтобы получить правильное отображение названия строки модели → , MvvmCross выполняет некоторые магические привязки, чтобы заставить это работать хорошо.
Скажем, у меня есть UIButton с именем Foo на мой взгляд, и я хочу отобразить его заголовок на свойство ButtonLabel в моей модели просмотра. Для создания такой привязки известны следующие работы:
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();
Есть ли другой способ добиться желаемого результата с помощью Fluent Bindings?
Ответы
Ответ 1
Поскольку кнопка не имеет права собственности, то
set.Bind(Foo).For(b => b.Title).To(vm => vm.ButtonTitle);
не будет компилироваться.
Однако конфигурация MvvmCross по умолчанию для Xamarin.ios имеет настраиваемую привязку, определенную для UIButton и "Title" - см.:
Из-за этого вы сможете позвонить:
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
Ответ 2
В более новой версии MvvmCross 5.x есть строго типизированные свойства привязки на основе кода.
Они выполняются так:
set.Bind(Button).For(v => v.BindTitle()).To(vm => vm. ButtonTitle);
убедитесь, что вы добавили это, используя:
using MvvmCross.Binding.iOS;
Полный список свойств расширения можно найти в документации здесь и этот является PR, изменения вступили в силу.