按下按钮时如何从集合视图中获取对应的对象?

问题描述

我有一个CollectionView,每个项目都包含2个按钮。编辑和删除。我想在按下按钮时删除或编辑项目。但是问题是当按下内部按钮时如何获得特定项目的对应对象?由于选择模式设置为无,因此按按钮也不会选择该项目。所以我不能通过以下方式使用- (Model)collView.SelectedItem.Constructor.... (//Do something where x:Name = collView)

这是我尝试过的东西-

<CollectionView x:Name="RequestCollectionView"
                SelectionMode="None"
                Margin="0,35,0">
    <CollectionView.ItemTemplate>
        <DataTemplate x:DataType="users:Student">
            <StackLayout>
                    <Label x:Name="studentName"
                           Text="{Binding Name}"
                           Margin="0,25,0"/>
                    <Button x:Name="acceptBtn"
                            Clicked="AcceptBtn_Clicked"
                            HeightRequest="24" 
                            WidthRequest="24"/>
                    <Button x:Name="rejectBtn"
                            Clicked="RejectBtn_Clicked"
                            HeightRequest="24" 
                            WidthRequest="24" 
                            Margin="0,15,0"/>
            </StackLayout>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

我尝试了以下方法,但没有成功->

private void AcceptBtn_Clicked(object sender,EventArgs e)
{
    // Here I get NullRef Exception
    testText.Text =
        ((Student)RequestCollectionView.SelectedItem).Name;
   // var t = (Student)sender; //Invalid Cast
}

如果标题不正确,请建议或编辑。我找不到这个问题的适当标题。请原谅我。

解决方法

使用BindingContext

private void AcceptBtn_Clicked(object sender,EventArgs e)
{
    var btn = (Button) sender;
    var student = (Student)btn.BindingContext;

    testText.Text = student.Name;

}
,

将CommandParameter添加到您的按钮

<Button x:Name="acceptBtn"
        Clicked="AcceptBtn_Clicked"
        HeightRequest="24" 
        WidthRequest="24"
        CommandParameter="{Binding .}"/>
<Button x:Name="rejectBtn"
        Clicked="RejectBtn_Clicked"
        HeightRequest="24" 
        WidthRequest="24" 
        Margin="0,15,0"
        CommandParameter="{Binding .}"/>

事件处理

private void AcceptBtn_Clicked(object sender,EventArgs e)
{
    if(sender is Button b && b.CommandParameter is Student student)
    {
       testText.Text = student.Name;
    }
}