【发布时间】:2019-01-11 22:28:28
【问题描述】:
所以我有一个 MasterDetails 设置,我想要实现的目标如下: 如果我在菜单 (MasterView) 中选择一个项目,我会看到它的结果 (DetailsView)。 这个DetailsView 是一个带有ViewCells 的ListView。到目前为止,一切都很好。 现在我想导航到 DetailsPage 内容的详细信息。 让我给你看一下这段代码:
XAML - AssignmentListPage.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 x:Name="myAssignments" Text="{Binding Title}" VerticalTextAlignment="Center" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
还有代码隐藏文件:
C# - AssignmentListPage.xaml.cs
public partial class AssignmentListPage : ContentPage
{
public AssignmentListPage ()
{
InitializeComponent ();
NavigateDetails();
}
protected override async void OnAppearing()
{
base.OnAppearing();
AssignmentsListView.ItemsSource = await
App.AssignmentManager.GetAssignmentsAsync();
}
public void NavigateDetails()
{
var tap = new TapGestureRecognizer();
tap.Tapped += (s, e) => OnLabelClickedAsync();
myAssignments.GestureRecognizers.Add(tap);
}
public async Task OnLabelClickedAsync()
{
await Navigation.PushAsync(new AssignmentDetailsPage());
}
}
问题是代码隐藏中的myAssignments 给了我一个“无法解析符号...”错误。
我尝试了以下方法但没有成功:
在NavigateDetails() 函数中,我将myAssignments 替换为:
var asd = this.FindByName<Label>("myAssignments");
asd.GestureRecognizers.Add(tap);
我也尝试过使用this,比如:
this.myAssignments.GestureRecognizers.Add(tap);
你们能告诉我我做错了什么吗?我无法访问标签。
【问题讨论】:
-
在模板内命名项目没有任何作用。创建模板时,您需要在 XAML 或代码中附加您的手势。
-
在此处详细说明 cmets 以及您在此处要求代码执行的操作。
ItemTemplate是 ListView 的一个属性。在其中,您可以定义它应该如何可视化列表中的项目。如果您将 10 个项目添加到列表中,则列表视图将使用模板 10 次来生成所需的可视化。所以即使你的代码隐藏可以通过它的 x:Name 访问这个myAssignments(它不能因为模板只是一个设计),你怎么能指望它知道你需要哪个呢?希望这能提供一些关于它为什么不起作用的见解 -
@Knoop 谢谢你的解释。你的台词“你怎么能指望它知道你需要哪一个”正是我将面临的问题。现在一切都清楚了,我按照 Jason 的建议解决了。
-
@Mirwais 正如我在对 Jason 回答的评论中指出的那样,我建议您查看 Commanding。它可能有点复杂,但是通过 Commanding,您可以使用 XAML 获得您可能想要的全部功能(当然,Command 本身就是代码)