Свободные привязки и названия 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, изменения вступили в силу.