2017-04-05 1 views
0

ich eine einfache Xamarin.Forms.ContentPage haben, die Menüpunkte in einer ListView zeigt:Xamarin.Forms.ListView Artikel mit dem Parameter angezapft

<ContentPage x:Class="Mob.Views.Public.MenuPage" ... > 
    <ScrollView> 
     <ListView ItemsSource="{Binding MenuItems}" ItemTapped="{Binding OnMenuItemTapped}"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <TextCell Text="{Binding Key}" /> 
        <!-- How to pass the "{Binding Value}" to OnMenuItemTapped? --> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </ScrollView> 
</ContentPage> 

-Code hinter:

public class MenuPage : ContentPage 
{ 
    public MenuPage() 
    { 
     InitializeComponent(); 
     BindingContext = new MenuViewModel(); 
    } 
    private async void OnMenuItemTapped(object sender, ItemTappedEventArgs e) 
    { 
     await (this.BindingContext as MenuViewModel).OnMenuItemTappedAsync(/* MUST PASS THE VALUE HERE*/); 
    } 
} 

Wie Sie sehen können Die ItemsSource ist an die MenuItems Eigenschaft meines ViewModel gebunden. Diese Eigenschaft ist vom Typ Dictionnary<string, string>. Die Key wird verwendet, um den Text der Elemente anzuzeigen, während die Value als Parameter an OnMenuItemTapped Ereignis übergeben werden soll.

class MenuViewModel : ViewModelBase 
{ 
    ... 
    public IDictionary<string, string> MenuItems { get { return _menuItems; } set { SetProperty(ref _menuItems, value); } } 
    // public ICommand OnMenuItemTappedCommand { get; set; } 
    public MenuViewModel() 
    { 
     MenuItems = new Dictionary<string, string>(); 
     MenuItems.Add("XXX", "PageX"); 
     MenuItems.Add("YYY", "PageY"); 
     MenuItems.Add("ZZZ", "PageZ"); 
     // ... 
     // I would've prefere to bind the item tap using a command but I can't figure out how to 
     // OnMenuItemTappedCommand = new Command<string>(OnMenuItemTappedAsync); 
    } 

    public async Task OnMenuItemTappedAsync(string targetPage) 
    { 
     // await Navigation.PushModalAsync(...); 
     // --> depending on the targetPage 
    } 
} 

Mein Ziel ist es auf die richtige Seite in Abhängigkeit vom Wert zu OnMenuItemTappedAsync weitergegeben zu navigieren.

Hinweis, ich versuche hier "reine" MVVM zu tun. Das bedeutet, dass ich weiß, dass ich keine Ereignisse verwenden und den Code fast leer lassen sollte. Aber ich kann nicht herausfinden, wie man Befehle in diesem Kontext benutzt.

Jede Idee/Ratschläge, wie dies zu erreichen ist?

+1

Ich glaube, dass e.Item Ihnen das Databound-Element aus der Liste geben wird, von dem Sie sowohl den Schlüssel und Wert – Jason

+0

@ Jason bekommen können: Thank you very much! Es scheint jetzt so offensichtlich ...! Ich habe immer noch Zweifel, ob es möglich ist, Befehle einfach "direkt" in irgendeiner Weise abzubilden, aber das wird es sicher tun. Danke nochmal für das schnelle Feedback :)! –

+0

Ein wenig offtopic: Nicht sicher, ob Sie Listview in ScrollView nur für diese Demo setzen, sonst bitte schauen Sie hier https://stackoverflow.com/questions/6210895/listview-inside-scrollview-is-not-scrolling-on- android/6211286 # 6211286 – K232

Antwort

1

Fügen Sie TapGesture zu ViewCell Inhalt hinzu und binden Sie den Befehl damit. Ex:

<TapGestureRecognizer Command="{Binding OnMenuItemTappedCommand}" CommandParameter="{Binding .}" /> 

In Ihrem Fall können Sie die Anwendung Command binden direkt an die TextCell.

<TextCell Command="{Binding OnMenuItemTappedCommand}" CommandParameter="{Binding .}"> 
+0

Wie kann ich den Befehlsparameter auf ContentPage erhalten? –

Verwandte Themen