我正在用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>
答案 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