如何将 UILabel 与 MvvmCross 绑定

问题描述

我正在使用 Xamarin 和 MvvmCross 6.4.2 编写一个小示例应用程序。我完成了 Xamarin.Android 版本,现在正在启动 Xamarin.iOS 版本。我为第一个屏幕创建了一个视图控制器:

[Register("SignInViewController")]
public class SignInViewController : MvxViewController<SignInviewmodel>
{
    public SignInViewController() : base(nameof(SignInViewController),null)
    {

    }

    public SignInViewController(IntPtr handle) : base(handle)
    {
    }

    public override void ViewDidLoad()
    {
        // Why does it crash when I call base.ViewDidLoad() ?
        //base.ViewDidLoad();

        NavigationController.NavigationBar.BarTintColor = UIColor.Blue;

        var label = new UILabel();
        label.Text = "test";
        label.BackgroundColor = UIColor.Red;
        label.Frame = new CoreGraphics.CGRect(30,100,100);

        View.Add(label);

        // This does not seem to work. If I remove it,label.Text will be "test"
        var set = this.CreateBindingSet<SignInViewController,SignInviewmodel>();
        set.Bind(label).For("Text").To(vm => vm.Username);
        set.Apply();
    }
}

我贴了一个测试标签只是为了开始并确保一切正常。由于我对其进行了硬编码,因此我希望标签具有文本“用户名测试”,但是当我运行该应用程序时它是空白的。此外,如果我尝试使用空引用异常调用 base.ViewDidLoad(),它会崩溃,这不应该,所以我认为我遗漏了一些重要的东西。

注意:我不想使用 MvvmCross 7,因为它仍在开发中。

解决方法

调用 const fileData = ` tcp.0: [1609172718.597749195,{"HOSTNAME":"sample-audi-lbs-1","IP":"10.55.17.231"}] tcp.0: [1609172718.597749195,"IP":"10.55.17.232"}] tcp.0: [1609172718.597749195,"IP":"10.55.17.233"}] tcp.0: [1609172718.597749195,"IP":"10.55.17.234"}] tcp.0: [1609172718.597749195,"IP":"10.55.17.235"}]`; const ipRegex = /((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/gm; var arr = fileData.match(ipRegex); console.log(arr); 为您第一次查看 :

this.Request = MvxViewModelRequest<SignInViewModel>.GetDefaultRequest();

参考:how-to-call-mvxdialogviewcontroller-as-a-popover)

,

在做了一些研究之后,我发现真正的问题是我没有正确地使用 iOS/MvvmCross。我想用 C# 编写所有视图并避免使用 storyboard/xib/designer 类,但必须先更改一些内容。接受的答案 here 为我解决了所有问题。