首页 > 解决方案 > 如何从按钮的 Clicked 事件导航到另一个页面并将列表视图的 ItemSelected 作为参数传递?

问题描述

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

问题是 - 我可以获得该值的唯一方法是单击列表视图中的项目。如何从按钮中获取该列表视图项目的点击值,而无需事先单击列表视图项目?

它看起来如何

另外这里的页面供参考。 带有 ShoppingList 项目的 ListView

我正在使用 Navigation.PushAsync(),我还传递了一个 ShoppingListDetailViewModel 并从 SelectedItem 注入项目

OnItemSelected

这是 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")

我试图制作 Command ,它可能会通过 Command 参数传递一个购物清单对象,但我对这一切感到困惑,我认为必须有更简单的解决方案来做到这一点,而我只是看不到。

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>


标签: c#xamarin.forms

解决方案


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

<ImageButton Grid.Column="1" Source="edit.png" 
  Clicked="EditListButton_Clicked" CommandParameter="{Binding .}" />

然后在你的处理程序中

public void EditListButton_Clicked(object sender, EventArgs args) 
{
  ImageButton btn = (ImageButton)sender;

  var item = (ShoppingList)btn.CommandParameter;

  if (item == null) return;

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

}

推荐阅读