C# 如何从按钮导航到另一页';s单击事件并传递listview';选择了哪些项作为参数?
我正在用Xamarin表单为Android编写一个应用程序。当用户单击“EditList”按钮(中间的按钮)时,我想将用户从一个页面导航到另一个页面,但同时我想传递一个特定类型的参数:“ShoppingList”,这是我从ListView的ItemSelected事件中获得的,以便在下一个页面上显示它的内容 问题是-我获得该值的唯一方法是单击listview中的项。如何从按钮中获取listview项clicked值,而不必事先单击listview项 它看起来怎么样 还有这一页供参考。 我使用的是Navigation.PushAsync(),在这里我还传递了一个ShoppingListDetailViewModel,并从SelectedItem中注入该项 已选定 以下是ListView针对ItemSelected事件的OnItemSelected事件处理程序:C# 如何从按钮导航到另一页';s单击事件并传递listview';选择了哪些项作为参数?,c#,xamarin.forms,C#,Xamarin.forms,我正在用Xamarin表单为Android编写一个应用程序。当用户单击“EditList”按钮(中间的按钮)时,我想将用户从一个页面导航到另一个页面,但同时我想传递一个特定类型的参数:“ShoppingList”,这是我从ListView的ItemSelected事件中获得的,以便在下一个页面上显示它的内容 问题是-我获得该值的唯一方法是单击listview中的项。如何从按钮中获取listview项clicked值,而不必事先单击listview项 它看起来怎么样 还有这一页供参考。 我使用的
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在项目中被更多地使用时,您可以理解它的角色。