2013-05-25 14 views
11

Ponieważ moje interfejsy użytkownika zazwyczaj muszą mieć zlokalizowane ciągi, moje modele widoku zapewniają wszystkie ciągi, które są wykorzystywane przez widoki. Obejmuje to takie rzeczy jak tytuły na przyciskach.Fluent Bindings i UIButton tytuły

po stronie iOS tytuły przycisków ustawia się za pomocą metody SetTitle.
Aby uzyskać podgląd modelu modelu => mapowanie przycisku, MvvmCross wykonuje pewne magiczne tłumaczenie, aby to działało dobrze.

Powiedz, że mam UIBUTTON o nazwie Foo w moim widoku i chcę odwzorować jego tytuł na właściwość ButtonLabel w moim modelu widoku. W znać następujące prace w celu utworzenia takiego wiązania:

this.AddBindings(new Dictionary<object, string>() { 
     {Foo, "Title ButtonTitle"} 
}); 

może to samo wiązanie być tworzone przy użyciu Fluent systemu wiąże w MvvmCross? Czytałem przez źródło MvvmCross i nie mam dość wiążącego kodu.

Ten Następujące nie działa (bo w rzeczywistości przycisk nie posiada właściwość Tytuł - ma metodę SetTitle):

var set = this.CreateBindingSet<FooView, FooViewModel>(); 
set.Bind(Foo).For(b => b.Title).To(vm => vm.ButtonTitle); 
set.Apply(); 

Czy istnieje inny sposób, aby osiągnąć pożądany efekt przy użyciu Fluent Wiązania?

Odpowiedz

27

Ponieważ przycisk nie ma tytułu propery, następnie

set.Bind(Foo).For(b => b.Title).To(vm => vm.ButtonTitle); 

nie będzie skompilować.

Jednak domyślny MvvmCross Configuraton dla Xamarin.ios ma zwyczaj wiązania zdefiniowane dla UIButton i "title" - patrz:

Z tego powodu powinieneś być w stanie zadzwonić:

set.Bind(Foo).For("Title").To(vm => vm.ButtonTitle); 

i powinno to setup samo wiążące jak:

this.AddBindings(new Dictionary<object, string>() { 
    {Foo, "Title ButtonTitle"} 
}); 

Na bardzo krótkim wprowadzeniem do niestandardowych wiązań zobaczyć: https://speakerdeck.com/cirrious/custom-bindings-in-mvvmcross

+0

W przypadku zlokalizowanych ciągów można również rozważyć zlokalizowaną funkcję wiązania języka - patrz https: // speakerdeck.com/cirrious/internationalization-in-mvvmcross i http://slodge.blogspot.co.uk/2013/05/n21-internationalisation-i18n-n1-days.html – Stuart

+0

To niesamowite. Odpowiedziałeś na moje pytanie i kilka innych, których nie miałem nawet pytania. – Frank

+0

Stuart wspomniał także: "jeśli spojrzysz na [ten link] (https://github.com/slodge/MvvmCross-Tutorials/blob/master/CustomBinding/CustomBinding.Droid/Setup.cs), zobaczysz, jak dodaj właściwość wiążącą "SpecialProperty" i właściwość wiązania "HitThis" do systemu " – Frank

1

W nowszej wersji MvvmCross 5.x nie są silnie wpisany kod oparty wiązania nieruchomości.

Są one wykonane w taki sposób:

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

upewnij się dodać to przy użyciu:

using MvvmCross.Binding.iOS; 

Pełną listę właściwości rozszerzeń można znaleźć w dokumentacji here i this jest PR zmiany poszły dalej.