2017-02-24 2 views
3

私はXamarinフォームから始めました。私はカスタムテンプレートに表示するアイテムのリストを持っています。Xamarinはクリックしたアイテムをコマンドパラメータとしてコマンドに渡します

私がしたい振る舞いは、ページのコンテキストで(Corcav.Behaviorsを使用して)発生しましたが、クリックした項目をコマンドに渡したいと思います。私は最後の部分を働かせるように見えません。以下の実装では、イベントは正しく発生しますが、渡されたパラメータはMyEventsListModelですが、クリックしたアイテムが必要です。

メモコードアンサーではなく、xaml/viewmodelのソリューションが必要です。そして、両方のイベントがイベントで発生する代わりの解決法も問題ありません。

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> 

のViewModel:

[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); 
      }); 
     } 
    } 
} 

答えて

2

ソリューションはかなり単純なものでした。 Corcavのソースコードに潜入した後、それを把握するのは簡単でした。次のコードは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); 
    } 
} 

です。単に "PassEventArgument"をtrueに設定するだけで問題が解決しました。

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

わかりやすく、ありがとうございます。 –

関連する問題