Xamarin Forms ListView Custom Cell 确定点击的列或控件

Xamarin Forms ListView Custom Cell determine clicked column or control

当我搜索这个时,我得到了很多点击,但我最终陷入了 WPF 特定的兔子洞或类似的东西。

我的环境是 Xamarin Forms Android、iOS 和 UWP。这是一个 experimental/educational 项目,因此对解决方案没有完全“硬”的要求。 ItemTappedEventArgs 为我提供了行的内容,但没有提供特定的项目或列。

如果用户点击 ListView ViewCell 中的特定项目,我如何确定他们点击了哪个特定列或控件?

这里是相关的XAML内容(RowStyle 只有 FontSize 和 Margin 等外观属性):

<ListView ItemsSource="{Binding CodeTable}" Margin="0, 0, 0, 0" SelectionMode="Single" ItemTapped="OnListViewItemTapped" x:Name="ListViewCodeTable" >
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="models:CodeTableRow">
            <ViewCell >
                <Grid BackgroundColor="Khaki" VerticalOptions="Start" MinimumHeightRequest="10">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Label Grid.Column="0" Text ="{Binding Decimal}" Style="{StaticResource RowStyle}" />
                    <Label Grid.Column="1" Text ="{Binding Hex}" Style="{StaticResource RowStyle}" />
                    <Label Grid.Column="2" Text ="{Binding Ascii}" Style="{StaticResource RowStyle}" FontAttributes="{Binding AttribAscii}" />
etc.

您可以像这里一样使用 SelectedItem 来完成

<ListView x:Name="dataList" ItemsSource="{Binding routeLabels}"
          HasUnevenRows="True" Grid.Row="1" Grid.Column="0"        
          Grid.ColumnSpan="3" SelectedItem="{Binding SelectedItem}">
</ListView>

在 ViewModel 中

private string _selectedItem;
public string SelectedItem {
    get {return _selectedItem; } 
    set 
    { 
        _selectedItem = value;
        // Additional code
    }
}

使用 ItemTapped 你必须从 xaml.cs 页面处理它:

<ListView x:Name="dataList" ItemsSource="{Binding routeLabels}"
          HasUnevenRows="True" Grid.Row="1" Grid.Column="0"        
          Grid.ColumnSpan="3" ItemSelected="Handle_ItemSelected" ItemTapped="MyItemTapped">
</ListView>

在后面的代码中

private async void MyItemTapped(object sender,  ItemTapEventArgs e)
{
    var content = e.Item as MyModel;
    await Navigation.PushAsync(new somePage(content));
}