如何从按钮的Clicked事件导航到另一个页面并通过listview的ItemSelected作为参数?

时间:2019-03-25 00:01:58

标签: c# xamarin.forms

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

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

外观

这也是供参考的页面。 ListView with ShoppingList items

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

OnItemSelected

这是ItemSelected事件的ListView的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参数传递购物清单对象,但我对此感到困惑,我认为必须有更简单的解决方案,以至于我看不到。 / p>

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>


2 个答案:

答案 0 :(得分:1)

将列表中当前项目的值分配给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)));

}

答案 1 :(得分:1)

  

如何从按钮内获得列表视图项目的单击值,而不必事先单击列表视图项目?

解决方案一:

XAML代码没有变化,db如下:

EditListButton_Clicked

解决方案二:

以杰森的身份表示,将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))); } 添加到CommandParameter如下:

ImageButton

然后<ImageButton Grid.Column="1" Source="edit.png" Clicked="EditListButton_Clicked" CommandParameter="{Binding .}> 中的是:

EditListButton_Clicked