Как получить соответствующий объект из представления коллекции при нажатии кнопки?

#c# #xaml #xamarin.forms #binding #collectionview

#c# #xaml #xamarin.forms #привязка #collectionview

Вопрос:

У меня есть CollectionView , и каждый элемент содержит 2 кнопки. Редактировать и удалять. Я хочу удалить или отредактировать элемент при нажатии кнопки. Но проблема в том, как я могу получить соответствующий объект этого конкретного элемента при нажатии внутренней кнопки? Поскольку режим выбора установлен на none, и нажатие кнопки также не приведет к выбору элемента. Поэтому я не могу получить доступ к элементу, используя следующий — (Model)collView.SelectedItem.Constructor.... (//Do something where x:Name = collView) .

Вот что я попробовал —

 <CollectionView x:Name="RequestCollectionView"
                SelectionMode="None"
                Margin="0,35,0,0">
    <CollectionView.ItemTemplate>
        <DataTemplate x:DataType="users:Student">
            <StackLayout>
                    <Label x:Name="studentName"
                           Text="{Binding Name}"
                           Margin="0,25,0,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,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
}
  

Если заголовок не подходит, предложите или отредактируйте, пожалуйста. Я не смог найти подходящее название для этого вопроса. Простите меня.

Ответ №1:

используйте BindingContext

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

    testText.Text = student.Name;

}
  

Комментарии:

1. в 3- System.InvalidCastException: 'Specified cast is not valid.' й строке написано: (

2. согласно опубликованному вами коду, Student должен быть правильный тип. Если это не так, вам нужно использовать отладчик, чтобы определить, какой тип он считает на самом деле.

3. на самом деле, я не могу привести эту строку -> var btn = (Button) sender; 🙁

4. какой тип он считает sender ?

5. На самом деле мой плохой, я использовал ImageButton в реальном коде. Неважно. Спасибо.

Ответ №2:

Добавьте 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,0,15,0"
        CommandParameter="{Binding .}"/>
  

Обработка событий

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