您不應該將TapGestureRecognizer
添加到ListView
。每個單元格都有處理點擊事件的事件,而GestureRecognizer可能只會混淆關於點擊應該做什麼的ListView
。有幾種方法可以解決這個問題。
1的SelectedItem結合
綁定SelectedItem
屬性爲ListView
和處理你的方法在setter方法調用。
<ListView x:Name="dataList" ItemsSource="{Binding routeLabels}"
HasUnevenRows="True" Grid.Row="1" Grid.Column="0"
Grid.ColumnSpan="3" SelectedItem="{Binding SelectedItem}">
</ListView>
並在您的視圖模型:
string _selectedItem;
public string SelectedItem {
get {return _selectedItem; }
set
{
_selectedItem = value;
// Additional code
}
}
2.使用內置的事件ItemSelected或ItemTapped
一個ListView
有你可以掛鉤一個名爲ItemSelected
和ItemTapped
一些事件。這些可以在代碼隱藏中被捕獲並且可以處理你想要實現的內容。
<ListView x:Name="dataList" ItemsSource="{Binding routeLabels}"
HasUnevenRows="True" Grid.Row="1" Grid.Column="0"
Grid.ColumnSpan="3" ItemSelected="Handle_ItemSelected" ItemTapped="Handle_ItemTapped">
</ListView>
3.使用事件,命令的行爲
結合由於您使用的ViewModels你最好不希望這些事件,因爲他們在UI端處理。有NuGet軟件包可以將事件轉換爲您可以在視圖模型中處理的Command。以Corcav.Behaviors爲例。
4.創建你自己的
行爲我有一個我經常使用的,看起來像這樣:
public class ListViewSelectedItemBehavior : Behavior<ListView>
{
public static readonly BindableProperty CommandProperty = BindableProperty.Create(nameof(Command), typeof(ICommand), typeof(ListViewSelectedItemBehavior));
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
public ListView AssociatedObject { get; private set; }
protected override void OnAttachedTo(ListView bindable)
{
base.OnAttachedTo(bindable);
AssociatedObject = bindable;
bindable.BindingContextChanged += OnBindingContextChanged;
bindable.ItemSelected += OnListViewItemSelected;
}
protected override void OnDetachingFrom(ListView bindable)
{
base.OnDetachingFrom(bindable);
bindable.BindingContextChanged -= OnBindingContextChanged;
bindable.ItemSelected -= OnListViewItemSelected;
AssociatedObject = null;
}
private void OnBindingContextChanged(object sender, EventArgs e)
{
OnBindingContextChanged();
}
private void OnListViewItemSelected(object sender, SelectedItemChangedEventArgs e)
{
if (Command == null)
return;
if (Command.CanExecute(e.SelectedItem))
Command.Execute(e.SelectedItem);
}
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
BindingContext = AssociatedObject.BindingContext;
}
}
要添加到您的ListView
你只是一個行爲添加到它:
<ListView x:Name="dataList" ItemsSource="{Binding routeLabels}"
HasUnevenRows="True" Grid.Row="1" Grid.Column="0"
Grid.ColumnSpan="3">
<ListView.Behaviors>
<behaviors:ListViewSelectedItemBehavior Command="{Binding ItemSelectedCommand}" />
</ListView.Behaviors>
</ListView>
在這種情況下ItemSelectedCommand
在你的ViewModel一個Command對象。
我會看看這些讓你知道了,謝謝。 – user3355961
在選項一中,您有屬性Route _selectedItem,該類型的Route應該表示什麼?我不知道 – user3355961
這是綁定到您的ListView項目的類型。由於代碼引用包含路由的ListView,我假定綁定到ListView的項目是Route對象。如果它是例如一串字符串將其更改爲「字符串」。 –