#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;
}
}