8

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!

Askolein
  • 3,250
  • 3
  • 28
  • 40
blakeD
  • 97
  • 1
  • 4
  • Possible duplicate of [Fluent Bindings and UIButton titles](https://stackoverflow.com/questions/16751013/fluent-bindings-and-uibutton-titles) – Iain Smith Sep 27 '17 at 10:55

4 Answers4

15

The easiest way to bind a UIButton Title:

set.Bind(btnFoo).For("Title").To(vm => vm.BtnFooText);
Niels
  • 1,366
  • 15
  • 21
  • I think this is the best answer, since this uses the custom binder provided by MvvmCross out of box, and serves exactly the purpose of what the OP is trying to achieve. – Sipke Schoorstra Sep 10 '17 at 18:38
9

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

Community
  • 1
  • 1
Stuart
  • 66,722
  • 7
  • 114
  • 165
  • 1
    AwesomeSauce! I sure appreciate the help! I also have a need to update images on the UI. Looks like Custom Binding is the answer to all of my questions. I appreciate your feedback and patience. I'm off to dive into the custom binding pool. – blakeD Jun 27 '13 at 12:41
  • 3
    The label on a button can be tricky - if you find that clicking the button causes the bound label to reset back to the one set in the XIB, try this syntax instead: `set.Bind(myButton).For("Title").To(vm => vm.PropertyToBindTo);` My understanding is that it invokes a binding written specifically for the UIButton.Title scenario. – Adam Jul 09 '15 at 00:32
7

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; }
    }
}
Mando
  • 11,414
  • 17
  • 86
  • 167
0

You can use:

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

adding the following using:

using MvvmCross.Binding.iOS;