【问题标题】:Xamarin Forms ListView Custom Cell determine clicked column or controlXamarin Forms ListView 自定义单元格确定单击的列或控件
【发布时间】:2022-03-14 09:48:45
【问题描述】:

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

我的环境是 Xamarin Forms Android、iOS 和 UWP。这是一个实验/教育项目,因此对解决方案没有完全“硬”的要求。 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.

【问题讨论】:

  • ItemTapped 在单元级别运行。如果您想在单元格内点击,请将手势识别器添加到该特定元素
  • ListView 具有 SelectedItem 属性,您将获得其中被点击的项目的值
  • @Divyesh_08 在 Android 上似乎 SelectedItem 没有在 Tapped 事件中填充,但我能够适当地投射发件人并从那里获取我需要的信息。

标签: listview xamarin.forms


【解决方案1】:

你可以像这里一样使用 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));
}

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 2016-07-23
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多