Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MvvmCross Bind to UIButton.TitleLabel.Text

I am attempting to bind to the text property of TitleLabel on a UIButton using MvvmCross for Xamarin.iOS. Here's what I have so far...

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

I've also tried...

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

Neither of which seem to work. I appreciate the help!

like image 522
blakeD Avatar asked Jun 27 '13 00:06

blakeD


3 Answers

The easiest way to bind a UIButton Title:

set.Bind(btnFoo).For("Title").To(vm => vm.BtnFooText);
like image 68
Niels Avatar answered Nov 16 '22 02:11

Niels


For debugging issues, enabling trace may help - see MvvmCross Mvx.Trace usage

For binding a property on a fixed pre-existing subcontrol of a subcontrol then this approach should work:

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

However, that won't continue to work if the sub control then changes its sub control at any point. For those cases, look at custom bindings - eg see http://slodge.blogspot.co.uk/2013/06/n28-custom-bindings-n1-days-of-mvvmcross.html

For the specific case of a uibutton, you can just bind its "Title" - see Fluent Bindings and UIButton titles

like image 9
Stuart Avatar answered Nov 16 '22 03:11

Stuart


For me UIButton binding to TitleLabel doesn't work. I came up with custom binding which works great and way flexible:

Apply binding:

  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; }
    }
}
like image 7
Alexey Strakh Avatar answered Nov 16 '22 03:11

Alexey Strakh