我有以下ListView,它显示列表中每个项目的按钮。我希望按钮能够通过他们的主键' BoxID'点击后打开一个新页面。由于相应的cs文档无法引用按钮而产生问题。为什么cs功能无法访问此按钮?有没有解决的办法?
XAML:
<ListView x:Name="boxList" ItemsSource="{Binding Boxes}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.View>
<StackLayout Orientation="Horizontal" Padding="10,0">
<StackLayout HorizontalOptions="StartAndExpand">
<Button x:Name="editBoxButton" Text="{Binding
BoxName}" CommandParameter="{Binding
BoxID}"
FontAttributes="Bold" Clicked="editBox"
HeightRequest="75" WidthRequest="150"
FontSize="Medium" BorderColor="Black"/>
</StackLayout>
<Label HorizontalOptions="EndAndExpand"
VerticalOptions="Center" Text="{Binding Complete}"/>
</StackLayout>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
CS:
private void editBox(object sender, EventArgs e) {
int temp_boxID = editBoxButton.CommandParameter;
Navigation.PushModalAsync(new EditBoxPage(temp_boxID));
}
由于
答案 0 :(得分:0)
它无法引用该按钮的原因是因为它位于DataTemplate
中。
现在你怎么解决它?这很简单,因为事件监听器是按钮的clicked
事件,只是将发送者强制转换为按钮。现在,您可以通过访问DataContext
UWP
或BindingContext
xamarin
XAMARIN
来进一步简化您的工作(因为您已经也提到了android标签)。您修改的 private void editBox(object sender, EventArgs e)
{
//if you're using VS2017 with c# 7.0
if (sender is Button editBoxButton)
{
if (editBoxButton.CommandParameter is int temp_boxID)
Navigation.PushModalAsync(new EditBoxPage(temp_boxID));
}
//if not then we'll go the traditional way
var editBoxButton = sender as Button;
if(editBoxButton!=null)
{
var boxID = editBoxButton.CommandParameter;
int temp_boxID;
int.TryParse(boxID.ToString(), out temp_boxID);
Navigation.PushModalAsync(new EditBoxPage(temp_boxID));
}
}
代码如下:
Visual Studio
我根据您使用的C# 6.0
版本以及您使用C# 7.0
或{{1}的语言版本,提出了两种方法。 }}