我试图知道在动态ListView中 Select /单击哪个项目,在DataTemplate中有一个自定义按钮,并try 一些可能性.

这是我代码的一部分,你知道如何做得更好吗?

var listView = new ListView();
listView.ItemsSource = await db.GetNodeMCUsAsync();
listView.ItemTemplate = new DataTemplate(() =>
{
    Label llb_id = new Label();
    llb_id.SetBinding(Label.TextProperty, "Id");

    Label lbl_binding = new Label()
    {
        VerticalOptions = LayoutOptions.Center,
        TextColor = Color.Black,
        FontSize = 16,
        Padding = new Thickness(5, 0, 0, 0),
        VerticalTextAlignment = TextAlignment.Start,
        HorizontalOptions = LayoutOptions.Start,
    };
    lbl_binding.SetBinding(Label.TextProperty, "Name");

    var editDeviceBtn = new Button
    {
        Padding = 0,
        Margin = new Thickness(15, 0, 0, 0),
        FontSize = 23,
        TextColor = Color.White,
        FontFamily = "FontIcons",
        Text = "\ue706",
        BackgroundColor = Color.Gray,
        BindingContext = this,
    };
    editDeviceBtn.SetBinding(Button.AutomationIdProperty, "Id");
    
    var turnOnDeviceBtn = new Button
    {
        Padding = 0,
        Margin = new Thickness(15, 0, 0, 0),
        FontSize = 20,
        TextColor = Color.White,
        FontFamily = "FontIcons",
        Text = "\ue703",
        BackgroundColor = Color.Gray,

    };
    turnOnDeviceBtn.SetBinding(Button.AutomationIdProperty, "IP");
    
    editDeviceBtn.Clicked += (o, e) =>
    {
        //NodeMCU obj = ((Button)o).DataContext as NodeMCU;
        //NodeMCU item = (o as Button).DataContext as NodeMCU;
        Navigation.PushAsync(new NodeMCU());
    };
    turnOnDeviceBtn.Clicked += (o, e) =>
    {
        //Only way I found
        var id = lbl_binding.Text;
    };

    var grid = new Grid
    {
        Padding = new Thickness(0, 5),
        ColumnDefinitions = new ColumnDefinitionCollection()
        {
            new ColumnDefinition { Width = new GridLength(.5, GridUnitType.Star) },
            new ColumnDefinition { Width = new GridLength(.25, GridUnitType.Star) },
            new ColumnDefinition { Width = new GridLength(.25, GridUnitType.Star) }
        }
    };
    grid.Children.Add(lbl_binding, 0, 1, 0, 1);
    grid.Children.Add(editDeviceBtn, 1, 2, 0, 1);
    grid.Children.Add(turnOnDeviceBtn, 2, 3, 0, 1);

    return new ViewCell
    {
        View = grid
    };
});

推荐答案

使用BindingContext

turnOnDeviceBtn.Clicked += (o, e) =>
{
    var button = (Button)o;
    var item = (NodeMCU)button.BindingContext;
    // item will be the object bound to the selected row
};

Android相关问答推荐

Android配置设置. gradle不同应用风格

在Android的Whatsapp中共享多个图片和文本

泛型类型lambda函数参数作为函数参数

Composable不会以LocalConext.Current作为活动呈现

如何隐藏OutlinedTextField边框上的提示标签

页面更改时不显示 cogo toast 消息

设置文本 colored颜色 动画时如何减少重新组合?

可以';t将数据插入房间数据库

如何将 Room Persistence 依赖项正确添加到我的 Jetack Compose Android 应用程序

如何在 compose 中使用可变对象?

使用 Dagger Hilt 获取接口的所有实例

Android:ActivityCompat.requestPermissions 不显示弹窗(Android 13,targetSdkVersion=33)

Jetpack 组合千位分隔符视觉转换,也适用于小数

Jetpack Compose Arc 进度条动画(如何重启动画)

如何在 Jetpack Compose 中的 VisualTransformation 之后将光标保持在文本字段的末尾

获取模板向导配方类 Intellij 中的应用程序包名称

在 Kotlin 中打开新片段时如何对当前片段应用更改?

协程是否在 if 条件下保持秩序?

Jetpack Compose:对角拆分卡片并将内容放入其中

禁用通知权限后启动前台服务导致崩溃(Android 13)