XAML如何访问ListView中的Button?

时间:2017-10-29 04:08:17

标签: c# android xaml listview

我有以下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));
}

由于

1 个答案:

答案 0 :(得分:0)

它无法引用该按钮的原因是因为它位于DataTemplate中。

现在你怎么解决它?这很简单,因为事件监听器是按钮的clicked事件,只是将发送者强制转换为按钮。现在,您可以通过访问DataContext UWPBindingContext 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}的语言版本,提出了两种方法。 }}