Беглые привязки и названия 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 11

2 ответа:

Поскольку кнопка не имеет свойства заголовка, то

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

В новой версии MvvmCross 5.x существуют строго типизированные свойства привязки на основе кода.

Они делаются так:

set.Bind(Button).For(v => v.BindTitle()).To(vm => vm. ButtonTitle);

Убедитесь, что вы добавили это с помощью:

using MvvmCross.Binding.iOS;

Полный список свойств расширения можно найти в документации здесь и это PR, в котором произошли изменения.