Xamarin Can't Access Controls on Code Behind
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.
Comments
-
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?