2016-07-06 9 views
1

Ich verwende das neue Steuerelement CarouselView in meiner App, um eine Sammlung von Text/Artikeln anzuzeigen. Jeder Artikel in der Sammlung enthält auch ein String-Array mit Text, den ich als Tags bezeichne. Ich möchte diese Tags horizontal in der Karussellansicht mit einem Steuerelement anzeigen, das Databinding ermöglicht. Das erwartete Aussehen sollte etwa so aussehen: direkt unter dem Haupttext: Expected look of tagsXamarin Forms-Tags in CarouselView

Irgendwelche Ideen, wie ich das erreichen könnte?

+0

kann jeder Ansicht eine globale Variable haben "Tittle" oder "Tag" genannt und Sie diese in den gesamten Code zugreifen kann: 'public string Tag1 = "Tag 1";' –

Antwort

1

Nun, zuerst die guten/schlechten Nachrichten: die ListView würde Ihnen erlauben, eine bindbare Gruppe von Tags zu präsentieren, aber leider unterstützt es derzeit keine Horizontal Ausrichtung, so dass es Ihre Bedürfnisse nicht erfüllen würde.

Das nächste wäre am besten, was ein horizontales StackLayout innerhalb eineine ScrollView enthalten sein:

<ScrollView Orientation="Horizontal"> 
    <StackLayout x:Key="tags" Orientation="Horizontal"> 
    </StackLayout> 
</ScrollView> 

Und bevölkert, dass StackLayout mit Daten aus dem Ansichtsmodell, wenn der Bindungskontext oder dass Eigenschaftsänderungen. Im folgenden Beispiel wird das StackLayout mit Label Ansichten gefüllt, die mit einem Stil namens "TagStyleName" formatiert sind.

// Note: If this code doesn't work, someone else wrote it. 
protected override OnBindingContextChanged() { 
    var vm = this.BindingContext as MyViewModelClass; 
    if (vm == null) return; 
    vm.PropertyChanged += (o, e) => { 
    if (e.PropertyName == "Tags") { 
     WatchTagsForChanges(); 
     RefreshTags(); 
    } 
    }; 
} 

private void WatchTagsForChanges() { 
    var vm = this.BindingContext as MyViewModelClass; 
    if (vm == null) return; 

    vm.Tags.CollectionChanged += (o, e) => RefreshTags(); 
} 

private void RefreshTags() { 
    var vm = this.BindingContext as MyViewModelClass; 
    if (vm == null) return; 

    this.tags.Children.Clear() 
    foreach (var tag in vm.Tags) { 
    this.tags.Children.Add(new Label{ Text = tag, Style = "TagStyleName" })); 
    } 
} 
+0

Danke. Ihre Lösung war mir schon einmal in den Sinn gekommen, aber ich habe sie als "PLAN B" zurückgestellt, da ich nach einer Lösung suchte, die innerhalb des Karussells ** gebunden werden kann, um Verzögerungen beim Beladen der Kinder beim Karussell zu vermeiden. Ich bin auf diese [link] (https://github.com/daniel-luberda/DLToolkit.Forms.Controls/blob/master/TagEntryView/README.md) gestoßen. Ich hatte nicht viel Erfolg und aufgrund von Zeitbeschränkungen für das Projekt habe ich jetzt "Plan B" verwendet. Daher ist Ihre Antwort eine Antwort. – Noel