在MVVMCross中正确使用DelayBind

时间:2015-01-13 15:23:35

标签: mvvmcross

我正在创建类似于N=32 - The Truth about ViewModels... starring MvxView on the iPad - N+1 days of MvvmCross中使用的Stuart的AddressUIView

在ctor中我创建了一些UI并调用了DelayBind,类似于Tutorial

public CustomerBannerView()
{
    BackgroundColor = UIColor.Green;

    var nameLabel = new UITextView();
    nameLabel.BackgroundColor = UIColor.Blue;
    nameLabel.Text = "Some Text";
    this.Add(nameLabel);

    var numberLabel = new UITextView();
    numberLabel.BackgroundColor = UIColor.Yellow;
    this.Add(numberLabel);

    this.DelayBind(
        () =>
            {
                var set = this.CreateBindingSet<CustomerBannerView, CustomerViewModel>();
                set.Bind(nameLabel).To(vm => vm.Name);
                set.Bind(numberLabel).To(vm => vm.Number);
                set.Apply();
            });

    this.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();

    this.AddConstraints(
        nameLabel.AtLeftOf(this, 10),
        nameLabel.AtTopOf(this, 10),
        numberLabel.AtRightOf(this, 10),
        numberLabel.AtTopOf(this, 10));

}

在教程中,MvxView的DataContext属性绑定到外部/父ViewModel上的Property。在包括我在内的许多情况下,Parent Property将为Null,然后在后续数据中为有效实例。

这意味着当最初应用外部绑定时,它会将MvxView的DataContext设置为Null。 DelayBind触发并输出以下警告

  

MvxBind:警告:23.37无法绑定:找不到源属性源属性:null-object上的名称[0:]   MvxBind:警告:23.37无法绑定:找不到源属性源属性:null-object上的数字

一旦将Parent Property设置为有效的实例,绑定确实会推送新值,没有问题吗?

  1. 我是否以不期望的方式使用DelayBind和DataContext属性?
  2. 如果DataContext没有改变,是否值得考虑更改MVVMCross以不调用DelayBind?即Null - &gt; Null不是改变

1 个答案:

答案 0 :(得分:1)

  1. 您没有以意想不到的方式使用DelayBind。您应该考虑的是避免在值保持不变时触发属性更改(我建议您使用Fody.PropertyChanged,这将自动处理)。

  2. 我不这么认为,因为它目前的工作方式为开发人员提供了更多的权力/自由。绑定负责根据DataContext更改保持UI更新,所有关于触发/不触发更改的逻辑都是DataContext本身的责任。