最后调用mvvmcross ViewModel的init()

时间:2014-12-11 19:09:34

标签: ios xamarin.ios xamarin mvvmcross

我有一个DetailViewModel,它有几个自定义按钮并在Init()中初始化它们。

public class DetailViewModel{
    ...
    public async void Init(DetailParameter params){
       ...
       CustomButtons.Add(new CustomButton(this, "1"));            //3
       CustomButtons.Add(new CustomButton(this, "2"));
       ...
    }
}

然后在详细视图中,我有几个按钮并使用DetailViewModel中的自定义按钮将它们绑定。

public partial class DetailView{
   private List<CustomButton> m_customButtons;
   public List<CustomButton> CutomButtons{
      get { return m_customButtons; }
      set { m_customButtons = value;                             //2
            foreach(CustomButton button in m_customButtons){
                UIButton myButton = new UIButton ();
                Add(myButton);
            }
      }
   }

   public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        var set = this.CreateBindingSet<DetailView, DetailViewModel>();
        set.Bind (this).For (v=>v.CustomButtons).To (vm=>vm.CustomButtons);//1
        set.Apply ();
    }
 }

问题是ViewModel的Init()最后被调用。 所以总是m_customButtons设置为0计数,然后调用ViewModel的Init()。 我知道CIRS,但如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

你可以做很多事情来改变你的绑定,使它在这个async场景中起作用 - 包括使用可观察的集合。

但是,您当前设置中最简单的路线可能只是更改ViewModel中的整个CustomButtons列表 - 例如类似的东西:

   var customButtons = new List<CustomButton>() {
      new CustomButton(this, "1"),
      new CustomButton(this, "2")
   };
   CustomButtons = customButtons;
   RaisePropertyChanged(() => CustomButtons);

在这种“一次性”场景中,此实现应该适合您。对于更高级的动态方案,也可能值得查看INotifyCollectionChanged实现。