2017-02-24 8 views
3

Ich begann gerade mit Xamarin Formen und jetzt habe ich eine Liste von Elementen, die ich in einer benutzerdefinierten Vorlage anzeigen.Xamarin Formulare übergeben angeklickt Element als Befehlsparameter

Das Verhalten, das ich möchte, ist, dass das Ereignis auf den Kontext der Seite ausgelöst (mit Corcav.Behaviors), aber ich möchte das angeklickte Element an den Befehl übergeben. Ich kann nicht scheinen, dass der letzte Teil funktioniert. Mit der folgenden Implementierung wird das Ereignis korrekt ausgelöst, aber der übergebene Parameter ist MyEventsListModel, aber ich möchte das Element, auf das geklickt wird.

Hinweis Ich möchte am liebsten eine Lösung in xaml/viewmodel und nicht im Code-behind. Eine alternative Lösung, bei der beide Ereignisse auf das Ereignis feuern, ist ebenfalls in Ordnung.

XAML:

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:behaviors="clr-namespace:Corcav.Behaviors;assembly=Corcav.Behaviors" 
      x:Class="TheEventsApp.Mobile.MyEventsList" 
      Title="My Events" 
      x:Name="MainPage"> 
    <ListView ItemsSource="{Binding Events}"> 
     <behaviors:Interaction.Behaviors> 
      <behaviors:BehaviorCollection> 
       <behaviors:EventToCommand EventName="ItemTapped" Command="{Binding NavigateToEventDetails}" CommandParameter="{Binding .}" /> 
      </behaviors:BehaviorCollection> 
     </behaviors:Interaction.Behaviors> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <ViewCell> 
        <StackLayout Orientation="Vertical"> 
         <Label Text="{Binding Name}" /> 
        </StackLayout> 
       </ViewCell> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
</ContentPage> 

Ansichtsmodell:

[ImplementPropertyChanged] 
public class MyEventsListModel : FreshBasePageModel 
{ 
    private readonly EventsDatastore eventsStore; 

    public MyEventsListModel(EventsDatastore eventsStore) 
    { 
     this.eventsStore = eventsStore; 
    } 

    protected async override void ViewIsAppearing(object sender, EventArgs e) 
    { 
     this.Events = await eventsStore.GetMyEventsAsync(); 
    } 

    public ObservableCollection<Event> Events { get; set; } = new ObservableCollection<Event>(); 

    public Command NavigateToEventDetails 
    { 
     get 
     { 
      return new Command(async (clickedEvent) => 
      { 
       await CoreMethods.PushPageModel<EventDetailsPageModel>(clickedEvent); 
      }); 
     } 
    } 
} 

Antwort

2

Die Lösung war ziemlich einfach. Nach dem Eintauchen in den Quellcode von Corcav war es einfach genug, es herauszufinden. Der folgende Code in EventToCommand.cs

private void OnFired(EventArgs e) 
{ 
    object param = this.PassEventArgument ? e : this.CommandParameter; 

    if (!string.IsNullOrEmpty(this.CommandName)) 
    { 
     if (this.Command == null) this.CreateRelativeBinding(); 
    } 

    if (this.Command == null) throw new InvalidOperationException("No command available, Is Command properly set up?"); 

    if (e == null && this.CommandParameter == null) throw new InvalidOperationException("You need a CommandParameter"); 

    if (this.Command != null && this.Command.CanExecute(param)) 
    { 
     this.Command.Execute(param); 
    } 
} 

Griffe es. Einfach "PassEventArgument" auf "true" setzen löste das Problem für mich.

<behaviors:EventToCommand EventName="ItemTapped" Command="{Binding NavigateToEventDetails}" PassEventArgument="True" /> 
+0

Einfach, wenn Sie wissen, wie, danke dafür. –

Verwandte Themen