bgcode
bgcode

Reputation: 121

Can someone tell me where I'm going wrong with Binding in Xamarin

Below I've attached snippets of my xaml & cs files. I'm trying to bind the entry boxes to the correct properties & the label is to be binded to the total property. I'm obviously going wrong somewhere I just can't put my finger on where. When using WPF I lay out my binding the same way. I've tried googling this & several videos which none seem to help my problem.

XAML

 <Label Text="{Binding Total}"
               TextColor="Black"
               FontSize="50"
               Grid.Column="1"
               Grid.ColumnSpan="3"
               Grid.Row="4"
               Grid.RowSpan="1"
               VerticalOptions="Center"
               HorizontalOptions="Center"/>

        <Label Text="APR Amount"
               TextColor="Black"
               FontSize="16"
               Grid.Column="1"
               Grid.ColumnSpan="3"
               Grid.Row="5"
               Grid.RowSpan="1"
               VerticalOptions="Center"
               HorizontalOptions="Center"/>

        <Label Text="£APR"
               TextColor="Black"
               FontSize="30"
               Grid.Column="1"
               Grid.ColumnSpan="3"
               Grid.Row="6"
               Grid.RowSpan="1"
               VerticalOptions="Center"
               HorizontalOptions="Center"/>

         <BoxView Color="CornflowerBlue"
                CornerRadius="0"
                Grid.Column="0"
                Grid.ColumnSpan="5"
                Grid.Row="7"
                Grid.RowSpan="1"   
                WidthRequest="700"
                HeightRequest="5"
                VerticalOptions="Center"
                HorizontalOptions="Center" />

        <Label Text="Loan Amount"
               TextColor="Black"
               FontSize="20"
               Grid.Column="0"
               Grid.ColumnSpan="3"
               Grid.Row="9"
               Grid.RowSpan="2"
               VerticalOptions="Center"
               HorizontalOptions="Center"
               Margin="0,0,0,0" />

        <Entry Grid.Row="9"
               Grid.Column="2"
               Grid.ColumnSpan="3"
               Grid.RowSpan="2"
               WidthRequest="120"
               VerticalOptions="Center"
               HorizontalOptions="End"
               Text="{Binding loanLength}"
               Margin="0,0,45,0" />

         <Label Text="Interest Rate"
               TextColor="Black"
               FontSize="20"
               Grid.Column="0"
               Grid.ColumnSpan="3"
               Grid.Row="11"
               Grid.RowSpan="2"
               VerticalOptions="Center"
               HorizontalOptions="Center"
               Margin="0,0,0,0" />

        <Entry Grid.Row="11"
               Grid.RowSpan="2"
               Grid.Column="2"
               Grid.ColumnSpan="3"
               WidthRequest="120"
               VerticalOptions="Center"
               HorizontalOptions="End"
               Text="{Binding intRate}"
               Margin="0,0,45,0" />

        <Label Text="Loan Length (Years)"
               TextColor="Black"
               FontSize="20"
               Grid.Column="0"
               Grid.ColumnSpan="3"
               Grid.Row="13"
               Grid.RowSpan="2"
               VerticalOptions="Center"
               HorizontalOptions="Center"
               Margin="0,0,0,0" />

        <Entry Grid.Row="13"
               Grid.RowSpan="2"
               Grid.Column="2"
               Grid.ColumnSpan="3"
               WidthRequest="120"
               VerticalOptions="Center"
               HorizontalOptions="End"
               Text="{Binding loanLength}"
               Margin="0,0,45,0"/>

C#

  private int loanAmount { get; set; }
        public int Loan
        {
            get => loanAmount;
            set
            {

                loanAmount = value;
                OnPropertyChanged("Loan");
                CalculateAPR();
            }

        }


        private int intRate { get; set; }
        public int Interest
        {
            get => intRate;
            set
            {

                intRate = value;
                OnPropertyChanged("Interest");
                CalculateAPR();
            }

        }

        private int loanLength { get; set; }
        public int Length
        {
            get => loanLength;
            set
            {

                loanLength = value;
                OnPropertyChanged("Length");
                CalculateAPR();
            }

        }


        private string total { get; set; }
        public string Total
        {
            get => total;
            set
            {

                total = value;
                OnPropertyChanged("Total");
            }
        }



        public void CalculateAPR()
        {
            if (Interest != 0)
            {
                Total = "£" + (Loan * Length) / Interest;
            }
            else
            {
                Total = "£ -";
            }
        }

Upvotes: 0

Views: 96

Answers (2)

Jessie Zhang -MSFT
Jessie Zhang -MSFT

Reputation: 13939

I created a demo to simulate your code,and it worked properly. There are severals problems in your code:

1.We should bind a public property, for example, you can bind like this:

      <Entry 
           Text="{Binding Loan}"
           Margin="0,0,45,0" />

Instead of

      <Entry 
           Text="{Binding loanLength}"
           Margin="0,0,45,0" />

The same is true of other fields.

Replace <Entry Text="{Binding intRate }"/> with <Entry Text="{Binding Interest}"/> and

Replace <Entry Text="{Binding loanLength }"/> with <Entry Text="{Binding Length}"/>

2.Try the following bindingContext code:

   <Grid >
    <Grid.BindingContext>
        <local:ViewModel></local:ViewModel>
    </Grid.BindingContext>
    <Grid.RowDefinitions>

    </Grid.RowDefinitions>

    <!--other code-->

 </Grid>

Upvotes: 0

Yurii Kyrychenko
Yurii Kyrychenko

Reputation: 54

you need to bind to a public property like "Length" or "Interest" and call PropertyChanged(nameof(loanLength)); for example (with private inside)

check this if you need https://learn.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/data-binding-basics

Upvotes: 1

Related Questions