问题描述
我有一个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;
}
}