2016-08-01 17 views
4

I Vorlage Set für Artikel ListView und ordnen ListenelementeWie aktuelle Element in ItemTemplate in Xamarin erhalten Forms

listView.ItemTemplate = new DataTemplate(typeof(CustomVeggieCell)); 
listView.ItemsSource = posts; 

Wie currentItem Element in CustomVeggieCell erhalten:

CustomVeggieCell.class:

public class CustomVeggieCell : ViewCell 
    { 
      public CustomVeggieCell(){ 
     // for example int count = currentItem.Images.Count; 
     var postImage = new Image 
     { 
      Aspect = Aspect.AspectFill, 
      HorizontalOptions = LayoutOptions.FillAndExpand, 
      VerticalOptions = LayoutOptions.FillAndExpand 
     }; 
     postImage.SetBinding(Image.SourceProperty, new Binding("Images[0]")); 
     var postImage = new Image 
     { 
      Aspect = Aspect.AspectFill, 
      HorizontalOptions = LayoutOptions.FillAndExpand, 
      VerticalOptions = LayoutOptions.FillAndExpand 
     }; 
     postImage.SetBinding(Image.SourceProperty, new Binding("Images[1]")); 
     } 
    } 

Ich möchte die Menge Images in ItemTemplate erhalten. Images ist einfach eine Liste von Strings.

p.s. Alle Werte in ItemTemplate erhalte ich verbindlich.

Antwort

2

Um das aktuelle Element in einem ItemTemplate erhalten Sie nur die CustomVeggieCell ‚s BindContext wie so verweisen müssen:

string imageString = (string)BindingContext; //Instead of string, you would put what ever type of object is in your 'posts' collection 

gesagt haben, dass sich der Code nicht vollständig Sinn für mich. Wenn Ihr CustomVeggieCell in einem ListView ist, sollte es nicht eine Liste der Elemente von hartzucodieren den Index des Elements zugreifen müssen, wie Sie hier haben:

new Binding("Images[1]") 

Die ListView im Grunde ein foreach durch alle Elemente tun sollten Sie. Es sei denn posts enthält eine Eigenschaft, die List<string> ist.

Edit: Jetzt habe ich ein besseres Verständnis für das Problem. Sie können möglicherweise eine neue bindbare Eigenschaft auf Ihrem erstellen und eine Methode im OnPropertyChanged-Parameter angeben, um die Bilder zu einem Layout hinzuzufügen und dann das Layout zu Ihrem hinzuzufügen. Ich habe noch nie so etwas probiert, also sei das alles vielleicht gar nicht.

Etwas wie:

public class CustomVeggieCell : ViewCell 
{ 
    public List<ImageSource> Images { 
     get { return (ImageSource)GetValue(ImagesProperty); } 
     set { SetValue(ImagesProperty, value); } 
    } 

    public static readonly BindableProperty ImagesProperty = BindableProperty.Create("Images", typeof(List<ImageSource>), typeof(CustomVeggieCell), null, BindingMode.TwoWay, null, ImageCollectionChanged); 

    private StackLayout _rootStack; 

    public InputFieldContentView() { 
     _rootStack = new StackLayout { 
      Children = //Some other controls here if needed 
     }; 

     View = _rootStack; 
    } 

    private static void ImageCollectionChanged(BindableObject bindable, object oldValue, object newValue) { 
     List<ImageSource> imageCollection = (List<ImageSource>)newValue; 

     foreach(ImageSource imageSource in imageCollection) { 
      (CustomVeggieCell)bindable)._rootStack.Children.Add(new Image { Source = imageSource }); 
     } 
    } 
} 

Oder so ähnlich. Dann würden Sie Ihre posts.Images an Ihre neue bindbare Eigenschaft binden. Wieder habe ich diesen Code gerade in das Textfeld geschrieben und vorher noch nichts getestet, aber lassen Sie mich wissen, wenn Sie Probleme haben.

+1

Danke für die Antwort. Aber BindingContext ist immer Null, als ich versuchte, var allModel = BindingContext als WallPostViewModel zu erhalten; oder var images = (IList ) BindingContext; In jedem Fall sind value und BindingContext null ... –

+0

@IgorLevkivskiy Der 'CustomVeggieCell.BindingContext' bleibt' null', bis die 'ListView' mit' CustomVeggieCells' gefüllt ist und die Daten auf dem Bildschirm angezeigt werden. Versuchen Sie zu erklären, was Sie mit 'CustomVeggieCell.BindingContext' versuchen und vielleicht können wir Ihnen weiterhelfen. – hvaughan3

+0

Ich möchte Bilder von currentItem erhalten, da jeder Beitrag unterschiedliche Anzahl an Fotos hat und deshalb möchte ich verschiedene Fotos für currentItem mit verschiedenen Layouts anzeigen. –