2017-01-30 7 views
1

Я использую Prism для реализации MVVM.Как связать событие ListView.ItemTapped с командой ViewModel в Xamarin Forms?

И у меня есть ситуация, когда у меня есть ListView, и мне нужно обработать событие ItemTapped, а также получить элемент, который был использован.

Я пробовал использовать EventToCommandBehavior.

Но я не мог заставить его работать, потому что он не признавал ссылки, которые были добавлены.

ответ

2

EventToCommandBehavior в настоящее время не существует в пакете pre1, доступном на NuGet. Это должно быть доступно, когда 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> 
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 и сохранить этот файл в совместном проекте между всеми библиотечными проектами).

 Смежные вопросы

  • Нет связанных вопросов^_^