我正在使用ListView来显示我从API获得的“任务”标题。单击作业后,我要转到该作业的详细信息页面。在这里,我想显示所选作业的描述和ID。我几乎都知道了这一切,但是我被困住了。
我的XAML页面如下:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="App.Views.AssignmentListPage"
Title="Opdrachten">
<ListView x:Name="AssignmentsListView" Margin="20">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Padding="20,0,0,0" HorizontalOptions="StartAndExpand" Orientation="Horizontal">
<Label Text="{Binding Title}" VerticalTextAlignment="Center">
<Label.GestureRecognizers>
<TapGestureRecognizer Tapped="OnLabelClicked" CommandParameter="{Binding .}"/>
</Label.GestureRecognizers>
</Label>
<!--<Label Text="{Binding Title}" VerticalTextAlignment="Center">
<Label.GestureRecognizers>
<TapGestureRecognizer Command="viewDetails" CommandParameter="{Binding .}"/>
</Label.GestureRecognizers>
</Label>-->
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我的后台代码如下:“
public partial class AssignmentListPage : ContentPage
{
public AssignmentListPage ()
{
InitializeComponent ();
}
protected override async void OnAppearing()
{
base.OnAppearing();
AssignmentsListView.ItemsSource = await App.AssignmentManager.GetAssignmentsAsync();
}
async void OnLabelClicked(object s, EventArgs e)
{
var a = e.ToString();
var assignment = new Assignment
{
Id = "1234",
Title = "Cross-Platform Application",
Description = "What a beautiful description"
};
var assignmentDetailsPage = new AssignmentDetailsPage
{
BindingContext = assignment
};
await Navigation.PushAsync(assignmentDetailsPage);
}
}
如您所见,我已经在OnLabelClicked
函数中硬编码了id,标题和描述。我想使用e.Parameter
来获取这些数据,但这不是我可以选择的东西。我只能从ToString
,Equals
,getType
中进行选择。但是,当我运行该应用程序并检查e
时,它确实包含“ Parameter”。见图片。
我尝试在XAML文件中使用Command
代替Tapped
,但是没有成功。我不知道该怎么做。
对于这一切我都是陌生的,而且我整天都在解决这个问题。我有一点隧道视野。我希望你们能为我指明正确的方向。
答案 0 :(得分:2)
ListView
具有内置的ItemTapped
和ItemSelected
事件,可以满足您的需求
<ListView x:Name="AssignmentsListView" Margin="20" ItemSelected="OnItemSelect">
public void OnItemSelect(sender s, SelectedItemChangedEventArgs a)
{
// a.SelectedItem will be the selected Item, you need to cast it
var item = (MyClass)a.SelectedItem;
...
}
答案 1 :(得分:0)
您正在混合两种不希望混合使用的不同用户交互模式。您可以采用@Jason建议的路线并使用事件模式,该模式等同于许多UI框架(包括WinForms)中使用的事件驱动范例。基于XAML的框架(WPF,Xamarin等)也完全支持它,但是也值得理解命令模式。
command pattern是为更具声明性的使用模型而构建的,并且是应用程序开发MVVM model的一部分。这个想法是,您可以使用数据绑定在前端视图和支持它们的对象(在这种情况下称为视图模型)之间创建松散的连接。
在事件模式中,您将连接通过.NET委托调用的事件处理程序,命令是从ICommand
派生的类,并且使用这些类型的对象来执行所需的逻辑以及执行指示状态(是否可以在当前时间调用该命令)之类的东西。
在这种情况下,您需要将ICommand
对象(通常是视图模型的可绑定属性)绑定到Command
的{{1}}属性和想要的值传递到TapGestureRecognizer
属性。调用后,CommandParameter
将被传递到CommandParameter
对象的Execute
方法。
有关更完整的代码示例,请参阅链接的文章(特别是有关Xamarin中的命令的文章)。
但是,如果需要,您确实可以返回到基于事件的可靠尝试模型。两者各有利弊。