C# 如何从按钮导航到另一页';s单击事件并传递listview';选择了哪些项作为参数?

C# 如何从按钮导航到另一页';s单击事件并传递listview';选择了哪些项作为参数?,c#,xamarin.forms,C#,Xamarin.forms,我正在用Xamarin表单为Android编写一个应用程序。当用户单击“EditList”按钮(中间的按钮)时,我想将用户从一个页面导航到另一个页面,但同时我想传递一个特定类型的参数:“ShoppingList”,这是我从ListView的ItemSelected事件中获得的,以便在下一个页面上显示它的内容 问题是-我获得该值的唯一方法是单击listview中的项。如何从按钮中获取listview项clicked值,而不必事先单击listview项 它看起来怎么样 还有这一页供参考。 我使用的

我正在用Xamarin表单为Android编写一个应用程序。当用户单击“EditList”按钮(中间的按钮)时,我想将用户从一个页面导航到另一个页面,但同时我想传递一个特定类型的参数:“ShoppingList”,这是我从ListView的ItemSelected事件中获得的,以便在下一个页面上显示它的内容

问题是-我获得该值的唯一方法是单击listview中的项。如何从按钮中获取listview项clicked值,而不必事先单击listview项

它看起来怎么样

还有这一页供参考。

我使用的是Navigation.PushAsync(),在这里我还传递了一个ShoppingListDetailViewModel,并从SelectedItem中注入该项

已选定

以下是ListView针对ItemSelected事件的OnItemSelected事件处理程序:

        async void OnItemSelected(object sender, SelectedItemChangedEventArgs args)
        {
            var item = args.SelectedItem as ShoppingList;
            if (item == null)
                return;

            await Navigation.PushAsync(new ShoppingListDetailPage(new ShoppingListDetailViewModel(item)));

            // Manually deselect item.
            ItemsListView.SelectedItem = null;
        }
(ItemsListView是在XAML中定义的我的ListView的名称,类似于x:name=“ItemsListView”)

我试着做一个命令,它可能会通过命令参数传递一个购物清单对象,但我对所有这些都感到困惑,我认为一定有更简单的解决方案,我就是看不出来

XAML

这是我的XAML页面,其中包含ListView和按钮:

<ListView x:Name="ItemsListView" 
                ItemsSource="{Binding ShoppingLists}"
                RefreshCommand="{Binding LoadItemsCommand}"
                IsPullToRefreshEnabled="true"
                IsRefreshing="{Binding IsBusy, Mode=OneWay}"
                CachingStrategy="RecycleElement"
                ItemSelected="OnItemSelected">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Padding="10">
                            <Label Text="{Binding Name}" 
                                HorizontalOptions="Center"/>
                                <Label  Text="{Binding BodyHighlight}" 
                                HorizontalOptions="Center" />
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <ImageButton Grid.Column="0"
                                                 Source="delete.png"> 
                                    </ImageButton>
                                    <ImageButton 
                                        Grid.Column="1" 
                                        Source="edit.png"
                                        Clicked="EditListButton_Clicked">
                                     </ImageButton>
                                    <ImageButton 
                                        Grid.Column="2" 
                                        Source="send.png" >
                                    </ImageButton>
                                </Grid>
                            </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>



将列表中当前项的值分配给按钮的CommandParameter

<ImageButton Grid.Column="1" Source="edit.png" 
  Clicked="EditListButton_Clicked" CommandParameter="{Binding .}" />
如何从按钮中获取listview项clicked值,而不必事先单击listview项

解决方案一:

Xaml代码未更改,单击编辑列表按钮,如下所示:

public void EditListButton_Clicked(object sender, EventArgs args) 
{
 ImageButton btn = sender as ImageButton;
 var item = btn.BindingContext as ShoppingList;
 if (item == null) return;
 await Navigation.PushAsync(new ShoppingListDetailPage(new ShoppingListDetailViewModel(item)));
}
<ImageButton  Grid.Column="1" Source="edit.png" Clicked="EditListButton_Clicked" CommandParameter="{Binding .}>
解决方案二:

如jason所说,将
CommandParameter
添加到
ImageButton
中,如下所示:

public void EditListButton_Clicked(object sender, EventArgs args) 
{
 ImageButton btn = sender as ImageButton;
 var item = btn.BindingContext as ShoppingList;
 if (item == null) return;
 await Navigation.PushAsync(new ShoppingListDetailPage(new ShoppingListDetailViewModel(item)));
}
<ImageButton  Grid.Column="1" Source="edit.png" Clicked="EditListButton_Clicked" CommandParameter="{Binding .}>

非常感谢。虽然我还有一个问题。您怎么知道必须执行这两个强制转换(特别是对btn.Binding上下文)才能获得该ListView项?我在理解上有问题。@Tomasz是的,这是对绑定上下文的一点理解。如果ListView的ItemSource绑定到ShoppingList,则每个ViewCell都绑定到ShoppingList、ViewCell。绑定中的每个元素都是ShoppingList,因此这次按钮绑定到ShoppingList。当BindingContext在项目中被更多地使用时,您可以理解它的角色。