2013-06-27 11 views
7

Ich versuche, die Texteigenschaft von TitleLabel auf einer UIButton mit MvvmCross für Xamarin.iOS zu binden. Hier ist, was ich bisher ...MvvmCross Bindet an UIButton.TitleLabel.Text

set.Bind(btnFoo).For(btn => btn.TitleLabel.Text).To(vm => vm.BtnFooText); 

ich auch versucht habe ...

set.Bind(btnFoo.TitleLabel).For(lbl => lbl.Text).To(vm => vm.BtnFooText); 

Keiner von denen scheinen zu arbeiten. Ich schätze die Hilfe!

+0

Mögliches Duplikat von [Fluent Bindings und UIButton Titeln] (h ttps: //stackoverflow.com/questions/16751013/fluent-bindings-and-uibutton-titles) –

Antwort

8

Für Debugging-Probleme, kann ermöglicht Spur helfen - MvvmCross Mvx.Trace usage

Für die Bindung eine Eigenschaft auf einem festen vorbestehenden Substeuerelement eines Substeuerelement sehen dann sollte dieser Ansatz funktionieren:

set.Bind(sub.subSub).For(c => c.PropertyName).To(vm => vm.Foo); 

jedoch, dass won Es funktioniert nicht weiter, wenn die Untersteuerung zu einem beliebigen Zeitpunkt ihre Untersteuerung ändert. Für die Fälle, Blick auf individuellen Bindungen - zB http://slodge.blogspot.co.uk/2013/06/n28-custom-bindings-n1-days-of-mvvmcross.html

Für den speziellen Fall eines UIButton sehen, können Sie nur noch den „Titel“ binden - Fluent Bindings and UIButton titles

+1

AwesomeSauce! Ich schätze die Hilfe! Ich muss auch Bilder auf der Benutzeroberfläche aktualisieren. Sieht aus wie Custom Binding ist die Antwort auf alle meine Fragen. Ich freue mich über Ihr Feedback und Ihre Geduld. Ich gehe in den Custom-Pool. – blakeD

+3

Die Beschriftung auf einer Schaltfläche kann knifflig sein - wenn Sie feststellen, dass durch Klicken auf die Schaltfläche die gebundene Beschriftung auf die in der XIB festgelegte zurücksetzt, versuchen Sie stattdessen diese Syntax: 'set.Bind (myButton) .For (" Title "). To (Vm => vm.PropertyToBindTo);' Mein Verständnis ist, dass es eine Bindung aufruft, die speziell für das UIButton.Title-Szenario geschrieben wird. – Adam

6

Für mich UIButton Bindung an Titlelabel sehen nicht funktioniert. Ich kam mit benutzerdefinierter Bindung auf, die funktionieren gut und Art und Weise flexibel:

Bewerben Bindung:

set.Bind(FinishedButton).For(UIButtonTextBinding.Property).To(v => v.FinishActionText); 

Binding-Code:

public class UIButtonTextBinding : MvxTargetBinding 
{ 
    public const string Property = "ButtonText"; 

    protected UIButton View 
    { 
     get { return Target as UIButton; } 
    } 

    public UIButtonTextBinding(UIButton target) 
     : base(target) 
    { 
    } 

    public override void SetValue(object value) 
    { 
     var view = View; 
     if (view == null) 
      return; 

     var stringValue = value as string; 
     view.SetTitle(stringValue, UIControlState.Normal); 
    } 

    public override Type TargetType 
    { 
     get { return typeof(string); } 
    } 

    public override MvxBindingMode DefaultMode 
    { 
     get { return MvxBindingMode.OneWay; } 
    } 
} 
4

Der einfachste Weg einen UIButton Titel zu binden:

set.Bind(btnFoo).For("Title").To(vm => vm.BtnFooText); 
+0

Ich denke, das ist die beste Antwort, da dies die benutzerdefinierte Mappe verwendet, die von MvvmCross bereitgestellt wird, und genau dem Zweck dient, was das OP zu erreichen versucht. –