【问题标题】:How can I access x:name in the code behind in Xamarin?如何在 Xamarin 后面的代码中访问 x:name?
【发布时间】: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 本身就是代码)

标签: c# xaml xamarin


【解决方案1】:

在 XAML 中添加手势识别器

<Label x:Name="myAssignments" Text="{Binding Title}" VerticalTextAlignment="Center" >
  <Label.GestureRecognizers>
    <TapGestureRecognizer Tapped="OnLabelClickedAsync" />
  </Label.GestureRecognizers>
</Label>

【讨论】:

  • 感谢您的评论!我尝试了我的建议并且它起作用了(在代码隐藏中进行了一些修改。所以不可能在代码隐藏中执行此操作?我对所有这些都是新手,所以感谢所有信息!
  • 您可以在代码隐藏中定义整个 DataTemplate。
  • 哦,好的,所以我不能部分完成。我需要在代码隐藏中定义整个事情。有道理,再次感谢。
  • 附带说明,如果您要使用 XAML 方法,我建议您查看命令而不是使用 Tapped 事件。我有一种感觉,这个实现正在努力使用在列表中点击的特定分配,并导航到该分配的详细信息页面。使用命令,您可以将 CommandParameter 设置为 DataTemplate 中的列表项,并在点击处理中使用它。它比这个要复杂一些,但我假设你最终会得到一个命令实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
相关资源
最近更新 更多