2017-09-04 4 views
-1

J'ai un contrôle personnalisé, le remplacement de UIScrollView. Lors du rendu de deux UIViews sont rendus. L'un est le PDF, l'autre est une couche supérieure. Le calque ci-dessus contient une collection de textes rendus à différents endroits sur le pdf. J'utilise MvvmCross pour avoir un modèle. La collection de textes est observable. Comment lier la collection observable aux résultats qui doivent être rendus dans la couche?iOS MvvmCross CustomBinding pour la vue

In short...pseudo 

UIScrollViewWrapper 
On draw create two layers 
layer 1 is pdf image 
layer above is view with texts. 

Texts need to be bind and observed by Model.Texts (ObservableCollection<string>) 

J'ai essayé:

var set = this.CreateBindingSet<ViewWithScrollView, ViewWithScrollViewModel>(); 
set.Bind(ScrollView.LayerView).For(x => x.LayerItems).To(vm => vm.LayerItems); 
set.Apply(); 

Le LayerView est MvxView pour BindingContext

+0

Votre question n'est pas claire. Et pourriez-vous partager plus de code que vous avez essayé? –

+0

J'ai trouvé une solution de travail que je vais poster, je vais aussi essayer de clarifier ma question avec une simple image. La mise à jour suivra bientôt! Ps. pour le downvoter, il suffit d'écrire un commentaire comme Cole au lieu de downvote seul ... –

Répondre

1

Ok la solution

La propre mise en œuvre du scrollview sera:

public class MyOwnScrollView : UIScrollView, IUIScrollViewDelegate, IMvxBindable 
{ 
    //Implement the IMvxBindable 
    //Add property BindingContext 
    public IMvxBindingContext BindingContext { get; set; } 

    //Property for holding the datacontext 
    [MvxSetToNullAfterBinding] 
    public object DataContext 
    { 
     get { return BindingContext.DataContext; } 
     set { BindingContext.DataContext = value; } 
    } 

    public MyOwnScrollView() 
    { 
     //Call Mvx for creating the bindingcontext 
     this.CreateBindingContext() 
    } 

    //Create something where you can create the set voor fluent binding with the view model. For example 
    public void MyBindingToCreate() 
    { 
     var set = new new MvxFluentBindingDescriptionSet<AViewInMyScrollView, MyViewViewModel>(AViewInMyScrollView); //Because CreateBindingSet is part of MvxView and UIScrollView is not MvxView 
     set.Bind(AViewInMyScrollView).For(x => x.MyPropertyOfView).To(vm => vm.PropertyOfViewModel); 
     set.Apply(); 
} 

Et l'endroit où vous utilisez le ScrollView sera une liaison au contexte de données

public partial class MyView : MvxView 
{ 
    public MyView() : base("MyView", null) 
    { 

    } 

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

     var set = this.CreateBindingSet<MyView, MyViewViewModel>(); 
     set.Bind(MyOwnScrollView).For(s => s.DataContext).To(vm => vm); 
     set.Apply(); 
    } 
} 

PS. Je vais implémenter cela dans MvvmCross par son propre contrôle. Cependant, ceci peut être utilisé pour tous les contrôles!