2013-05-25 13 views
11

Poiché le interfacce utente in genere richiedono stringhe localizzate, i miei modelli di visualizzazione forniscono tutte le stringhe consumate dalle visualizzazioni. Questo include cose come i titoli sui pulsanti.Legature fluide e titoli UIButton

sul lato iOS, i titoli dei pulsanti sono impostati tramite il metodo SetTitle.
Per ottenere un modello di vista stringa => la mappatura del titolo pulsante per funzionare, MvvmCross esegue una traduzione di rilegatura magica per farlo funzionare correttamente.

dire che ho un UIButton di nome Foo nella mia vista e voglio mappare il suo titolo a una proprietà ButtonLabel nel mio View Model. Nel conoscere i seguenti lavori, al fine di istituire un tale legame:

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

Può questo stesso legame essere impostato utilizzando il sistema di rilegatura Fluente in MvvmCross? Sto leggendo la fonte MvvmCross e non sto ottenendo abbastanza il codice vincolante.

Questo seguente non funziona (perché in realtà il pulsante non ha una proprietà Title - ha un metodo di SetTitle):

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

C'è un altro modo per ottenere il risultato desiderato utilizzando Fluent Associazioni?

risposta

27

perché il pulsante non ha un propery titolo, quindi

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

non verrà compilato.

Tuttavia, il configuraton MvvmCross predefinito per Xamarin.ios ha una personalizzato legame definiti per UIButton e "Titolo" - vedi:

Per questo motivo dovresti poter chiamare:

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

e questo dovrebbe impostare la stessa vincolante:

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

Per una breve introduzione in associazioni personalizzate vedere: https://speakerdeck.com/cirrious/custom-bindings-in-mvvmcross

+0

Per le stringhe localizzate, si potrebbe anche prendere in considerazione la funzionalità di associazione linguistica localizzata: consultare https: // speakerdeck.com/cirrious/internationalization-in-mvvmcross e http://slodge.blogspot.co.uk/2013/05/n21-internationalisation-i18n-n1-days.html – Stuart

+0

Questo è fantastico. Hai risposto alla mia domanda e a molti altri che ho avuto senza nemmeno chiederlo. – Frank

+0

Stuart ha anche detto: "se guardi [questo link] (https://github.com/slodge/MvvmCross-Tutorials/blob/master/CustomBinding/CustomBinding.Droid/Setup.cs) vedrai come aggiungere una proprietà di associazione 'SpecialProperty' e una proprietà di collegamento 'HitThis' al sistema " – Frank

1

Nella versione più recente di MvvmCross 5.x non sono fortemente tipizzati codice basato vincolante proprietà.

sono fatto in questo modo:

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

Assicurati di aggiungere questo utilizzando:

using MvvmCross.Binding.iOS; 

Un elenco completo delle proprietà di estensione possono essere trovati nella documentazione here e this è il PR i cambiamenti sono andati avanti.