如何将ListView.ItemTapped事件绑定到Xamarin Forms中的ViewModel命令?

时间:2017-01-30 04:35:48

标签: xamarin mvvm xamarin.forms prism

我正在使用Prism来实现MVVM。

我有一个情况,我有一个ListView,必须处理ItemTapped事件,并获得点击项目。

我尝试使用EventToCommandBehavior

但我无法让它工作,因为它没有识别添加的引用。

2 个答案:

答案 0 :(得分:3)

NuGet上可用的pre1包中当前不存在EventToCommandBehavior。这在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>

答案 1 :(得分:2)

我建议采用不同的方法。

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,并将此文件保存在所有库项目之间的共享项目中)。