2013-03-20 41 views
4

我需要一个自定义绑定,我知道何时何地,但我不知道如何做到这一点。这是我的自定义绑定中视图的关系。考虑像控件一样的视图。 enter image description heremvvmcross中的海关绑定交叉视图

我有从ViewModel-> ContainerView-> FirstView的连接,但我无法将其与TableView连接。为了将ContainerView连接到FirstView,我做了一个自定义绑定(现在在一个方向上)。而在setValue方法我称之为的firstView的方法SetBinding(在这里我想做的结合)

我尝试了一些选择,但什么也没有发生,最后一个看起来是这样的:

public GolferList CurrentGolferList { get; set; } 
    public void SetBinding(GolferList golferList){ 
     this.CurrentGolferList = golferList; 

     TableSource = new TableSourcePlayers(TableViewPlayers); 
     var bindingDescription = new[]{ 
      new MvxBindingDescription {TargetName = "ItemsSource",SourcePropertyPath = "CurrentGolferList"} , 
     }; 

     Binder.Bind(this,TableSource, bindingDescription); 

     TableViewPlayers.Source = TableSource; 
     TableViewPlayers.ReloadData(); 

    } 

我会感谢你能告诉我另一种处理方式。

更新: 我跟着斯图尔特的链接,现在它工作正常,多亏斯图亚特! 其实,在我的计划中,TableView是一个MvxSimpleBindableTableViewSource,我想在那里绑定数据。所以为了使其工作,我用下面的代码(SetBinding需要一些外部重构):

private List<IMvxUpdateableBinding> bindings; 
    private string BindingText = "{'ItemsSource':{'Path':'CurrentGolfers'}}"; 
    public object DataContext { 
     get { return dataContext; } 
     set { dataContext = value; 
      if (bindings == null) 
       bindings = this.GetService<IMvxBinder>().Bind(dataContext, TableSource, BindingText).ToList(); 
      else 
       bindings.ForEach(b => b.DataContext = dataContext); 
      } 
     } 
    public void SetBinding(GolferList golferList){ 
     this.DataContext = PlayViewModel; 
     tableView.Source = TableSource; 
     tableView.ReloadData(); 
    } 

注意BindingText分表,而不是视图本身。

更新2 现在在V3它有点不同。首先,鉴于必须实现IMvxBindable这个成员:

public object DataContext 
    { 
     get { return BindingContext.DataContext; } 
     set { BindingContext.DataContext = value; } 
    } 

    public IMvxBindingContext BindingContext { get; set; } 

(不要忘记处置调用BindingContext.ClearAllBindings(),还调用CreateBindingContext()在viewload)

,然后你会能够在你的班级中绑定。在我的情况下:

var set = this.CreateBindingSet<FirstPlayViewController, PlayViewModel>(); 
    set.Bind(source).To(vm => vm.CurrentGolfers).Apply(); //I love the new fluent api :) 

回答

2

我想你想要做的是实际的数据绑定视图,而不是自定义绑定。

这是覆盖在这个问题 - Custom bindable control in a MvvmCross Touch project

基本上你需要做的是增加“绑定”和“的DataContext”属性您FirstView的集合。

如果你这样做,那么你应该能够在FirstView内对数据绑定(对DataContext)进行数据绑定,就像在任何普通的MvvmCross视图中一样。

注意 - 在v3中这样做会容易得多,因为我们添加了一个'BindingContext'对象来协助完成这种类型的操作