MvvmCross绑定到UIButton.TitleLabel.Text

8

我正在尝试使用MvvmCross绑定Xamarin.iOS上UIButton的TitleLabel的文本属性。这是我目前的代码...

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

我也尝试过...

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

这两种方法似乎都无效。非常感谢您的帮助!


可能是流畅绑定和UIButton标题的重复问题。 - Iain Smith
4个回答

15

绑定UIButton标题的最简单方法

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

我认为这是最好的答案,因为它使用了 MvvmCross 提供的自定义绑定器,并且完全达到了 OP 所尝试实现的目的。 - Sipke Schoorstra

9

对于调试问题,启用跟踪可能有所帮助 - 请参见MvvmCross Mvx.Trace使用

如果要绑定子控件的固定预先存在的子控件属性,则应该使用以下方法:

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

然而,如果子控件随后在任何时候更改其子控件,则该方法将无法继续工作。 对于这些情况,请查看自定义绑定 - 例如请参阅http://slodge.blogspot.co.uk/2013/06/n28-custom-bindings-n1-days-of-mvvmcross.html 对于特定的uibutton情况,您可以直接绑定它的“Title” - 请参见Fluent Bindings and UIButton titles

1
太棒了!我非常感谢你的帮助!我还需要更新UI上的图像。看起来自定义绑定是我所有问题的答案。感谢您的反馈和耐心。我要开始深入研究自定义绑定了。 - blakeD
3
如果您发现点击按钮会导致绑定的标签重置回在XIB中设置的标签,那么按钮上的标签可能有些棘手 - 尝试使用以下语法:set.Bind(myButton).For("Title").To(vm => vm.PropertyToBindTo);。我的理解是,它调用了专门为UIButton.Title场景编写的绑定。 - Adam

7

对我来说,UIButton绑定到TitleLabel不起作用。我想出了一种自定义绑定,它非常好用且更加灵活:

应用绑定:

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

绑定代码:

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; }
    }
}

0

您可以使用:

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

使用以下内容进行添加:

using MvvmCross.Binding.iOS;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接