Xamarin Can't Access Controls on Code Behind

12,148

Solution 1

The latest update seemed to fix the issue; these references works OK:

this.FirstName.Text = "A";
this.LastName.Text= "B";

It appears some of the designer problems are resolved.

Solution 2

you can try this

var asdf = this.FindByName<TimePicker>("tagName");

there are SUGGESTIONS to do here:

https://forums.xamarin.com/discussion/25409/problem-with-xaml-x-name-and-access-from-code-behind

DIRECT ANSWER from that link

On your page properties check the following properties are set:

BuildAction = Embedded Resource CustomTool = MSBuild:UpdateDesignTimeXaml

If that's okay, delete the obj & bin folders are rebuild the PCL.

If you import a XAML page into a PCL for example the attributes get changed and it won't compile.

Share:
12,148
Brian Mains
Author by

Brian Mains

Computer Aid Inc. Consultant, Microsoft MVP.

Updated on June 17, 2022

Comments

  • Brian Mains
    Brian Mains almost 2 years

    For my Xamarin Forms project (latest version 1.3), when I create a view in Xamarin Studio (latest, 5.5.4), I define the view as the following:

    <?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="FormsDemo.Register">
      <ContentPage.Content>
    
        <Grid>
          <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
          </Grid.RowDefinitions>
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition />
          </Grid.ColumnDefinitions>
    
          <Label Grid.Row="0" Grid.Column="0" Text="First Name" />
          <Entry x:Name="FirstName" Grid.Row="0" Grid.Column="1" />
    
          <Label Grid.Row="1" Grid.Column="0" Text="Last Name" />
          <Entry x:Name="LastName" Grid.Row="1" Grid.Column="1" />
    
          <Label Grid.Row="2" Grid.Column="0" Text="Email" />
          <Entry x:Name="Email" Grid.Row="2" Grid.Column="1" />
    
          <Button x:Name="SaveButton" Grid.Row="3" Grid.Column="0" Text="Login" />
        </Grid>
    
      </ContentPage.Content>
    </ContentPage>
    

    However, in my code-behind, any references to the control by its name are not being found at all. The following code is erroring (noted by comments):

    using System;
    using System.Collections.Generic;
    using Xamarin.Forms;
    
    namespace FormsDemo
    { 
      public partial class Register : ContentPage
      { 
        public Register ()
        {
          InitializeComponent ();
    
                //Using this approach worked, but is not ideal
          this.FindByName<Button>("SaveButton").Clicked += Save_Clicked;
        }
    
        void Save_Clicked (object sender, EventArgs e)
        {
          this.FirstName.Text = "A";
          this.LastName.Text= "B";
        }
      }
    }
    

    Oddly enough, I was getting warnings with:

    Warning: The private field `FormsDemo.Register.FirstName' is assigned but its value is never used (FormsDemo.Solution)

    I get one for each field. Why is this not working? How do I get IntelliSense to work?