私はMVVMを実装するためにPrismを使用しています。XamarinフォームでListView.ItemTappedイベントをViewModelコマンドにバインドする方法はありますか?
私はListViewを持ち、ItemTappedイベントを処理してタップ項目を取得しなければならない状況があります。
私はEventToCommandBehaviorを使ってみました。
しかし、追加された参照を認識していなかったため、それを動作させることができませんでした。
私はMVVMを実装するためにPrismを使用しています。XamarinフォームでListView.ItemTappedイベントをViewModelコマンドにバインドする方法はありますか?
私はListViewを持ち、ItemTappedイベントを処理してタップ項目を取得しなければならない状況があります。
私はEventToCommandBehaviorを使ってみました。
しかし、追加された参照を認識していなかったため、それを動作させることができませんでした。
EventToCommandBehavior
は現在NuGetで利用可能なpre1パッケージには存在しません。これはpre2がリリースされたときに利用可能になります。
私の推薦は、あなたが今のプロジェクトにEventToCommandBehaviorをコピーするか、あなたは、私が使用するものを追加することができることを次のようになります。
/// <summary>
/// ListView Item Tapped Behavior.
/// </summary>
public class ItemTappedBehavior : BehaviorBase<ListView>
{
/// <summary>
/// Gets or sets the command.
/// </summary>
/// <value>The command.</value>
public ICommand Command { get; set; }
/// <inheritDoc />
protected override void OnAttachedTo(ListView bindable)
{
base.OnAttachedTo(bindable);
AssociatedObject.ItemTapped += OnItemTapped;
}
/// <inheritDoc />
protected override void OnDetachingFrom(ListView bindable)
{
base.OnDetachingFrom(bindable);
AssociatedObject.ItemTapped -= OnItemTapped;
}
void OnItemTapped(object sender, ItemTappedEventArgs e)
{
if (Command == null || e.Item == null) return;
if (Command.CanExecute(e.Item))
Command.Execute(e.Item);
}
}
次に、あなたのXAML
<ListView.Behaviors>
<behaviors:ItemTappedBehavior Command="{Binding SelectedItemCommand}" />
</ListView.Behaviors>
に、私はお勧めします別のアプローチ。
public class AppListView: ListView{
public AppListView(): base(ListViewCachingStrategy.RecycleElement){
this.ItemSelected += (s,e)=>{
this.TapCommand?.Invoke(e.Item);
}
}
#region Property TapCommand
/// <summary>
/// Bindable Property TapCommand
/// </summary>
public static readonly BindableProperty TapCommandProperty = BindableProperty.Create(
nameof(TapCommand),
typeof(System.Windows.Input.ICommand),
typeof(AppListView),
null,
BindingMode.OneWay,
null,
null,
null,
null,
null
);
/// <summary>
/// Property TapCommand
/// </summary>
public System.Windows.Input.ICommand TapCommand
{
get
{
return (System.Windows.Input.ICommand)GetValue(TapCommandProperty);
}
set
{
SetValue(TapCommandProperty, value);
}
}
#endregion
}
今AppListView
の代わりListView
を使用してTapCommand="{Binding ...}"
を使用しています。 Intellisenseが正しく動作するためには、このクラスを別のライブラリプロジェクト(Android用、iOS用、およびすべてのライブラリプロジェクト間で共有プロジェクトに保存する)に保管することをおすすめします。